节点:将函数传递给Promise

时间:2017-10-17 06:25:59

标签: node.js express promise

我是Node的新手,从未对前端Web开发或Javascript做过多少工作,但我正在尝试做一些简单的前端任务,并且看到了我不理解的错误。我已经阅读了一些关于我所看到的错误的帖子,但很多都没有接受答案,而其他人似乎无关紧要。我还在David Herron的Node.js Web开发书中读过几次关于promises的部分,所以我想我理解了promises背后的想法,但是我对我看到的一些错误感到困惑。

我正在运行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'并将“任意字符串”发送回客户端。但是,如果我尝试将res.send作为'.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(以字符串作为参数)将在res.send(也将字符串作为参数)不起作用时起作用?我觉得这很奇怪,特别是因为res.send只在promise结构之外工作,而console.log在任何地方都可以工作。

1 个答案:

答案 0 :(得分:1)

我认为这是一个具有约束力的问题。像这样写res.send会将函数与res分开。试试这个来保留绑定:

res.send.bind(res)