Error: Argument passed in must be a single String of 12 bytes or a string of 24 hex characters
Error: Argument passed in must be a single String of 12 bytes or a string of 24 hex characters
此错误是根据 route/function 定义的顺序发生的,我也搜索了发生此错误的不同原因,但没有遇到这个具体原因
//Save Task
router.get("/tasks/newrec",function(req,res,next){
var newtask={
title:"newtask5",
isdone:"true"
}
db.tasks.save(newtask,function(error,result){
if(error){res.send(error); }
else
{ res.send("success"); }//res.json(result);}
});
});
如果我首先声明这个函数,那么我看不到任何错误,如果我声明为第二个或第三个函数,那么我看到这个 error.I 正在使用带有 mongojs 的节点。
var express=require('express');
var router=express.Router();
var mongojs= require('mongojs');
var db=mongojs('taskdb',['tasks']);
//display all tasks
router.get('/tasks',function(req,res,next){
db.tasks.find(function(err,tasks){
res.json(tasks);
});
});
//To find single record with id
router.get('/tasks/:id',function(req,res,next){
var uid = req.params.id.toString();
db.tasks.findOne({_id:mongojs.ObjectId(uid)},function(err,doc){
res.json(doc);
});
});
//Save Task
router.get("/tasks/newrec",function(req,res,next){
var newtask={
title:"newtask5",
isdone:"true"
}
db.tasks.save(newtask,function(error,result){
if(error){res.send(error); }
else
{ res.send("success"); }//res.json(result);}
});
});
可能与路径声明的顺序有关,我有时会遇到这种情况。
这些是你的路径:
- /任务
- /任务/:id
- /tasks/newrec
这3个都是GET方法。问题来了,因为一些请求路径在多个路径中匹配。例如,/tasks/something 匹配第二个,但匹配第一个。即使/tasks/newrec,你以为它匹配第三条,但它匹配3条路径。并按照您声明的顺序表达对路径的评估,因此它永远不会进入第三条路径。这就是为什么我认为 express 会引发错误。
基本规则是每个 HTTP 方法总是在之前声明更具体的路径。在您的情况下,这将是正确的顺序:
- /tasks/newrec
- /任务/:id
- /任务
恰恰相反。
希望对你有帮助
如果不能按路由顺序解决,可以用其他方式解决
这是解决方案
创建新文件 checkObjId.js 并放入此代码
const mongoose = require("mongoose");
// middleware to check for a valid object id
const checkObjectId = idToCheck => (req, res, next) => {
if (!mongoose.Types.ObjectId.isValid(req.params[idToCheck]))
return res.status(400).json({ msg: "Invalid ID" });
next();
};
module.exports = checkObjectId;
并应用你的任务路线
router.get('/tasks/:id',checkObjectId (id),function(req,res,next){
var uid = req.params.id.toString();
db.tasks.findOne({_id:mongojs.ObjectId(uid)},function(err,doc){
res.json(doc);
});
});
此错误是根据 route/function 定义的顺序发生的,我也搜索了发生此错误的不同原因,但没有遇到这个具体原因
//Save Task
router.get("/tasks/newrec",function(req,res,next){
var newtask={
title:"newtask5",
isdone:"true"
}
db.tasks.save(newtask,function(error,result){
if(error){res.send(error); }
else
{ res.send("success"); }//res.json(result);}
});
});
如果我首先声明这个函数,那么我看不到任何错误,如果我声明为第二个或第三个函数,那么我看到这个 error.I 正在使用带有 mongojs 的节点。
var express=require('express');
var router=express.Router();
var mongojs= require('mongojs');
var db=mongojs('taskdb',['tasks']);
//display all tasks
router.get('/tasks',function(req,res,next){
db.tasks.find(function(err,tasks){
res.json(tasks);
});
});
//To find single record with id
router.get('/tasks/:id',function(req,res,next){
var uid = req.params.id.toString();
db.tasks.findOne({_id:mongojs.ObjectId(uid)},function(err,doc){
res.json(doc);
});
});
//Save Task
router.get("/tasks/newrec",function(req,res,next){
var newtask={
title:"newtask5",
isdone:"true"
}
db.tasks.save(newtask,function(error,result){
if(error){res.send(error); }
else
{ res.send("success"); }//res.json(result);}
});
});
可能与路径声明的顺序有关,我有时会遇到这种情况。 这些是你的路径:
- /任务
- /任务/:id
- /tasks/newrec
这3个都是GET方法。问题来了,因为一些请求路径在多个路径中匹配。例如,/tasks/something 匹配第二个,但匹配第一个。即使/tasks/newrec,你以为它匹配第三条,但它匹配3条路径。并按照您声明的顺序表达对路径的评估,因此它永远不会进入第三条路径。这就是为什么我认为 express 会引发错误。 基本规则是每个 HTTP 方法总是在之前声明更具体的路径。在您的情况下,这将是正确的顺序:
- /tasks/newrec
- /任务/:id
- /任务
恰恰相反。 希望对你有帮助
如果不能按路由顺序解决,可以用其他方式解决 这是解决方案 创建新文件 checkObjId.js 并放入此代码
const mongoose = require("mongoose");
// middleware to check for a valid object id
const checkObjectId = idToCheck => (req, res, next) => {
if (!mongoose.Types.ObjectId.isValid(req.params[idToCheck]))
return res.status(400).json({ msg: "Invalid ID" });
next();
};
module.exports = checkObjectId;
并应用你的任务路线
router.get('/tasks/:id',checkObjectId (id),function(req,res,next){
var uid = req.params.id.toString();
db.tasks.findOne({_id:mongojs.ObjectId(uid)},function(err,doc){
res.json(doc);
});
});