當我像這樣運行我的代碼時,我遇到了類似的錯誤castError: cast to object failed for value new
app.get("/products/:id", async (req, res) => {
const { id } = req.params;
const product = await Product.findById(id);
res.render('products/show', { product });
});
app.get('/products/new', (req, res) => {
res.render("products/new");
});
但是當我像這樣切換格式時,代碼在我的本地機器上正常運行。
app.get('/products/new', (req, res) => {
res.render("products/new");
});
app.get("/products/:id", async (req, res) => {
const { id } = req.params;
const product = await Product.findById(id);
res.render('products/show', { product });
});
問題可能是由于我的路徑引數或訂單計數我剛開始學習 express.js 時我不理解
uj5u.com熱心網友回復:
app.get("/products/:id", async (req, res) => {
const { id } = req.params;
const product = await Product.findById(id);
res.render('products/show', { product });
});
app.get('/products/new', (req, res) => {
res.render("products/new");
});
在上面的格式中,路由上面的new路由包含一個路由引數:id。Express 匹配后面的任何內容,就/products好像它是路由引數一樣:id,這就是為什么在上面的格式中出現錯誤的原因。
對于這個,express 知道如果后面/products/是 is new,它將運行app.get('/products/new',回呼中的代碼:
app.get('/products/new', (req, res) => {
res.render("products/new");
});
app.get("/products/:id", async (req, res) => {
const { id } = req.params;
const product = await Product.findById(id);
res.render('products/show', { product });
});
uj5u.com熱心網友回復:
在這種情況下,順序很重要。如果您將帶有引數的路由放在前面 ( /products/:id),它將把任何以引數開頭的路由/products/視為引數路由。因此,下面的路由將被視為 id 等于的產品 api 呼叫new。
app.get('/products/new', (req, res) => {
res.render("products/new");
});
您可以通過將引數路由放在新路由之后來解決此問題。
app.get('/products/new', (req, res) => {
res.render("products/new");
});
app.get("/products/:id", async (req, res) => {
const { id } = req.params;
const product = await Product.findById(id);
res.render('products/show', { product });
});
uj5u.com熱心網友回復:
路由是按照它們定義的順序進行評估的,它也不像 an 的id樣子。
所以假設你有一個請求/products/new
當您的代碼如下所示時:
app.get("/products/:id", async (req, res) => {
const { id } = req.params;
const product = await Product.findById(id);
res.render('products/show', { product });
});
app.get('/products/new', (req, res) => {
res.render("products/new");
});
宣告的第一個路由是"/products/:id",它是一個匹配并且req.params.id將等于"new"。因為有一個匹配,它甚至不會查看在它之后宣告的路由。
*編輯你如何能夠先來并仍然按照你想要的方式作業,可能不是最好的,而是引數"/products/:id"用例的一個例子next
app.get("/products/:id", async (req, res, next) => {
const { id } = req.params;
if (id === 'new') {
next();
return; // important to remember, without it the code below will also fire
}
const product = await Product.findById(id);
res.render('products/show', { product });
});
app.get('/products/new', (req, res) => {
res.render("products/new");
});
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/443518.html
標籤:javascript 节点.js 表示
上一篇:Cors已啟用,但仍然收到此“來源已被CORS政策阻止:不存在'Access-Control-Allow-Origin'標頭”
