我在 Express 應用程式中的路線有問題。這是我的 app.js:
var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');
var mongoose = require('mongoose');
var methodOverride = require("method-override");
var indexRouter = require('./routes/index');
var categoriesRouter = require('./routes/categories');
var productsRouter = require('./routes/products');
var app = express();
// create default connection to the database and binds to the error event
var mongoDB = 'mongodb srv:// ...';
mongoose.connect(mongoDB, { useNewUrlParser: true , useUnifiedTopology: true});
var db = mongoose.connection;
db.on('error', console.error.bind(console, 'MongoDB connection error:'));
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(methodOverride('_method'))
app.use('/', indexRouter);
app.use('/categories', categoriesRouter);
app.use('/products', productsRouter);
app.use(express.static(path.join(__dirname, 'public')));
// catch 404 and forward to error handler
app.use(function(req, res, next) {
next(createError(404));
});
// error handler
app.use(function(err, req, res, next) {
// set locals, only providing error in development
res.locals.message = err.message;
res.locals.error = req.app.get('env') === 'development' ? err : {};
// render the error page
res.status(err.status || 500);
res.render('error');
});
module.exports = app;
route/index.js 和 route/categories.js 檔案中的所有鏈接都按預期作業。無論如何,我確實包含了 route/categories.js 檔案,以防它與我的問題有關。
這是路由/categories.js:
var express = require('express');
var category_controller = require('../controllers/categoryControllers');
var router = express.Router();
router.get('/', category_controller.category_listing_get);
router.get('/create', category_controller.category_create_get);
router.post('/create', category_controller.category_create_post);
router.get('/:id', category_controller.category_update_get);
router.put('/:id', category_controller.category_update_post);
router.delete('/:id', category_controller.category_delete_post);
module.exports = router;
這是路線/products.js:
var express = require('express');
var product_controller = require('../controllers/productControllers');
var router = express.Router();
router.get('/', product_controller.products_listing_get);
router.get('/subset/:id', product_controller.products_subset_get);
router.get('/subset/create', product_controller.products_create_get);
router.post('/subset/create', product_controller.products_create_post);
router.get('/subset/update/:id', product_controller.products_update_get);
router.put('/subset/update/:id', product_controller.products_update_post);
router.delete('/subset/:id', product_controller.products_delete_post);
module.exports = router;
這是 controllers/productControllers.js 的相關部分
const Product = require('../models/product');
const Category = require('../models/category');
exports.products_create_get = function(req, res) {
res.send("get form for creating products")
};
這是模型/products.js
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var ProductSchema = new Schema(
{
prod_name: {type: String, required: true, maxLength: 50},
prod_description: {type: String, required: true, maxLength: 120},
prod_category: {type: Schema.Types.ObjectId, ref: 'Category'},
prod_price: {type: String},
prod_stock: {type: String},
}
);
module.exports = mongoose.model('Product', ProductSchema);
現在,如果我在瀏覽器地址欄上輸入:
本地主機:3000/產品/子集/
我確實得到了預期的結果。但是,如果我輸入:
本地主機:3000/產品/子集/創建
我確實在終端上收到一條似乎與 mongo 資料庫有關的錯誤訊息,但我不明白這一點,因為我在請求 localhost:3000/products/subset/create 時沒有對資料庫采取行動。
這是我收到的錯誤訊息:
GET /products/subset/create - - ms - - create CastError: Cast to ObjectId failed for value "create" (type string) at path "prod_category" for model "Product" at model.Query.exec (/home/paul/ proj/node_modules/mongoose/lib/query.js:4777:21)在model.Query.Query.then(/home/paul/proj/node_modules/mongoose/lib/query.js:4876:15)在exports.products_subset_get (/home/paul/proj/controllers/productControllers.js:13:14) 在 Layer.handle [as handle_request] (/home/paul/proj/node_modules/express/lib/router/layer.js:95:5)在下一個 (/home/paul/proj/node_modules/express/lib/router/route.js:137:13) 在 Route.dispatch (/home/paul/proj/node_modules/express/lib/router/route.js: 112:3) 在 Layer.handle [as handle_request] (/home/paul/proj/node_modules/express/lib/router/layer.js:95:5) 在 /home/paul/proj/node_modules/express/lib/路由器/索引。js:281:22 at param (/home/paul/proj/node_modules/express/lib/router/index.js:354:14) at param (/home/paul/proj/node_modules/express/lib/router/index .js:365:14) { messageFormat: undefined, stringValue: '"create"', kind: 'ObjectId', value: 'create', path: 'prod_category', reason: BSONTypeError: 傳入的引數必須是字串新 ObjectId (/home/paul/proj/node_modules/ bson/lib/objectid.js:67:23) 在 castObjectId (/home/karima/paul/proj/node_modules/mongoose/lib/cast/objectid.js:25:12) 在 ObjectId.cast (/home/paul/ proj/node_modules/mongoose/lib/schema/objectid.js:246:12) 在 ObjectId.SchemaType.applySetters (/home/paul/proj/node_modules/mongoose/lib/schematype.js:1189:12) 在 ObjectId.SchemaType._castForQuery (/home/paul/proj/node_modules/mongoose/lib/schematype.js:1623:15) 在 ObjectId.SchemaType.castForQuery (/home/paul/proj/node_modules/mongoose/lib/ schematype.js:1613:15) 在 ObjectId.SchemaType.castForQueryWrapper (/home/paul/proj/node_modules/mongoose/lib/schematype.js:1590:20) 在演員 (/home/kpaul/proj/node_modules/mongoose/ lib/cast.js:344:32) 在 model.Query.Query.cast (/home/paul/proj/node_modules/mongoose/lib/query.js:5199:12), valueType: 'string'20) 在演員 (/home/kpaul/proj/node_modules/mongoose/lib/cast.js:344:32) 在 model.Query.Query.cast (/home/paul/proj/node_modules/mongoose/lib/query. js:5199:12),值型別:'字串'20) 在演員 (/home/kpaul/proj/node_modules/mongoose/lib/cast.js:344:32) 在 model.Query.Query.cast (/home/paul/proj/node_modules/mongoose/lib/query. js:5199:12),值型別:'字串'
我嘗試更改 app.js 檔案中陳述句的順序,清除快取,更改路由名稱,重新啟動我的虛擬機,但我只是不明白發生了什么,因為我只想發送一個短字串到瀏覽器并沒有根據我的請求接觸資料庫,但似乎仍然出現與資料庫相關的錯誤。
注意: localhost:3000/categories/create 也可以正常作業。
uj5u.com熱心網友回復:
您宣告這兩條路線的順序導致了問題:
router.get('/subset/:id', product_controller.products_subset_get);
router.get('/subset/create', product_controller.products_create_get);
Express 不會將請求匹配到最佳路線(無論可能是什么),而是第一條路線。
在這種情況下,因為/subset/:id是 before 宣告/subset/create的,所以發出請求/subset/create將匹配第一個路由。
最簡單的解決方案是切換它們的宣告,以便首先匹配更具體的路線:
router.get('/subset/create', product_controller.products_create_get);
router.get('/subset/:id', product_controller.products_subset_get);
或者,如果您嘗試使用 REST 語意,請使用 POST 請求來/subset創建新物體。
如果:id將具有固定格式,您可以將匹配限制為僅在其 URL 中具有有效 id 的請求。例如一個 ObjectId:
app.get('/subset/:id([a-fA-F0-9]{24})', …)
FWIW,堆疊跟蹤實際上指出products_subset_get被呼叫:
… at exports.products_subset_get (/home/paul/proj/controllers/productControllers.js:13:14)
^^^^^^^^^^^^^^^^^^^^^^^^^^^
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/494150.html
