javascript - 从express js中的路由调用函数对象

标签 javascript node.js express

我的代码看起来像这样:

router.route('/user')
.post(function(req, res, next){

 queryDB(arg1, arg2, prepareRes)

})
.get(function(req, res, next){

queryDB(arg3, arg4, prepareRes)    

});

var prepareRes = function(err, data){

    if(err) next(err);
    else{
        req.data = data;
    }
};

当我运行此代码时,出现以下错误:

ReferenceError: next is not defined

ReferenceError: req is not defined

发生这种情况是因为 req 和 next 超出了prepareRes范围。

如何解决这个错误?

我不想在两个路由中重复相同的代码行,并且不可能使用

route.all

就我而言。

最佳答案

prepareRes 是在 post 和 get 处理程序之外声明的,因此它无法访问 req(uest) 或 next。

最明显的解决方案是将 request 和 next 参数添加到prepareRes函数签名中,然后在请求处理程序中调用prepareRes时,将调用包装在可以访问它们的匿名函数中:

router.route('/user')
.post(function(req, res, next){

    queryDB(arg1, arg2, function(err, data){

        prepareRes(err,data, req, next);
    })

})
.get(function(req, res, next){

    queryDB(arg3, arg4, function(err, data){

        prepareRes(err,data, req, next);
    })

});

var prepareRes = function(err, data, req, next){

if(err) next(err);
else{
    req.data = data;
}
};

使用像 lodash 这样的东西,你可以摆脱匿名函数并部分应用附加参数,如下所示:

queryDB(arg1, arg2, _.partialRight(prepareRes, res, next));

但是你仍然需要更改prepareRes签名。

关于javascript - 从express js中的路由调用函数对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27732623/

相关文章:

javascript - Mongoose 索引html文本?

javascript - Passport OAuth 持有者或 isAuthenticated

javascript - 与嵌入式 Google Apps 电子表格交互

javascript - 在 postgresql 数据库中存储 semver 版本字符串以进行范围查询

javascript - 试图改变点击的 Three.js 对象的颜色,但场景中所有对象的颜色都改变了

file - 如何使用 node.js 测试文件权限?

javascript - 需要帮助设置 Node/Knex 迁移

javascript - Mocha 测试后关闭服务器,但数据仍然存在

javascript - Expressjs : issue with image file encoding during res. 下载

javascript - Reactjs 如何从多个 url 获取数据?