【问题标题】:Error: Argument passed in must be a single String of 12 bytes or a string of 24 hex characters错误:传入的参数必须是 12 个字节的单个字符串或 24 个十六进制字符的字符串
【发布时间】:2020-08-31 23:30:07
【问题描述】:

这个错误是根据定义的路由/函数的顺序发生的,我也搜索了这个错误发生的不同原因,但没有遇到这个具体原因

//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);}
        });    

    });

如果我首先声明这个函数,那么如果我声明为第二个或第三个函数,我会看到这个错误。我正在使用带有 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);}
    });    

});

【问题讨论】:

    标签: node.js express mean-stack mongojs


    【解决方案1】:

    可能与路径声明的顺序有关,我有时会遇到这种情况。 这些是你的路径:

    • /任务
    • /tasks/:id
    • /tasks/newrec

    这 3 个都是 GET 方法。问题出现是因为一些请求路径在多个路径中匹配。例如,/tasks/something 在第二个匹配,但在第一个匹配。即使是 /tasks/newrec,您也认为它与第三个匹配,但它与 3 个路径匹配。并按照您声明它们的顺序表达评估路径,因此它永远不会进入第三条路径。这就是为什么我认为 express 会引发错误。 基本规则是每个 HTTP 方法总是在之前声明更具体的路径。在您的情况下,这将是正确的顺序:

    • /tasks/newrec
    • /tasks/:id
    • /任务

    正好相反。 希望对你有帮助

    【讨论】:

    • 是的,路线的顺序是问题所在。谢谢
    • 我也是这样做的。更改了我的获取路线的顺序,但什么也没发生。同样的老错误。
    【解决方案2】:

    如果不按路线顺序解决,可以用其他方式解决 这是解决方案 创建新文件 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);
        });
    });
    

    【讨论】:

    • 即使你添加了这个中间件,问题仍然会发生。原因是路径名“newrec”会被路径参数“:id”误认为,并且您的 isValid 检查会发现路径名不是 mongo id 导致 400 而不是之前的参数错误。实际的解决方法是正确地将路径参数路由的路由排序为最后一个,因为这基本上是提供的基本路由下的全部内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-11
    • 1970-01-01
    • 2016-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多