节点:将function传递给承诺

我是Node新手,从来没有做过很多前端Web开发或Javascript,但我正在尝试做一些简单的前端任务,并看到我不明白的错误。 我已经阅读了一些关于我看到的错误的文章,但是很多没有被接受的答案,而其他的则似乎没有关系。 在David Herron的“Node.js Web Development”一书中,我也仔细阅读过有关承诺的章节,所以我想我理解promise中的想法,但是我所看到的一些错误让我感到困惑。

我正在运行一个express.js服务器。 我有一个查询方法在一个文件query.js(简化)需要一个键,并返回一个值,看起来像这样:

'use strict' function query(key) { return Promise.resolve().then(() => { // ... lots of stuff and more '.then' things }).then((arg) => { return arg[0] // this is always a string } module.export.query = query 

然后我有一个server.js文件,其中包含快递服务器的代码。 一种方法有效,一种方法不行,我不知道有什么区别。 以下是按预期工作的方式:

 const express = require('express') const bodyParser = require('body-parser') const app = express() var q = require('./query.js') app.use(express.static('public')) app.use(bodyParser.urlencoded({ extended: false})) app.post('/path', function (req, res) { q.query(req.body.param).then(console.log).catch((err) => { console.error("My Error:", err) } res.send("arbitrary string") }) app.listen(3000, function () { console.log('Example app listening on port 3000!') }) 

当我发送post请求时,用param ='key'它正确地输出'value'到控制台并且发送“任意string”回到客户端。 但是,如果我尝试将res.send作为parameter passing给“.then”事件,以便将检索到的值返回给客户端,则会出现错误。 所以,如果我改变app.post到:

 app.post('/path', function (req, res) { q.query(req.body.param).then(res.send).catch((err) => { console.error("My Error:", err) } }) 

我明白了

 My Error: TypeError: Cannot read property 'req' of undefined at send (/home/u/NodeServer/node/myapp/node_modules/express/lib/response.js:110:17) 

有谁知道为什么一个console.log(这需要一个string作为参数)将工作时res.send(也需要一个string作为参数)不会? 我觉得这很奇怪,尤其是因为res.send只能在promise结构之外工作,并且console.log无处不在。

我相信这是一个有约束力的问题。 写这样res.send将从res分离function。 试试这个来保留绑定:

 res.send.bind(res)