【问题标题】:Node: Passing function to a Promise节点:将函数传递给 Promise
【发布时间】:2018-03-28 18:27:10
【问题描述】:

我是 Node 新手,从来没有做过很多前端 Web 开发或 Javascript,但我正在尝试做一些简单的前端任务,但我看到了我不理解的错误。我已经阅读了许多关于我所看到的错误的帖子,但很多都没有接受答案,还有一些似乎无关。我还多次阅读了 David Herron 的 Node.js Web 开发一书中关于 Promise 的部分,所以我认为我理解 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!')
})

当我使用 param='key' 发送 post 请求时,它会正确地将 '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 可以在任何地方工作。

【问题讨论】:

  • 第 110:17 行的内容
  • 提示:该问题与this 有关。您正在传递该方法,但您丢失了要应用该方法的对象。使用调用res.send 的函数,或使用apply
  • 深入到 express.js 库中,它位于 res.send 定义的顶部 (res.send = function send(body) { var chunk = body; var encoding; var req = this .req; ...
  • q.query(req.body.param) 返回的承诺是什么?什么类型的价值?目的?细绳?数字?因为如果它是您想要发回给您的客户的对象,那么q.query(req.body.param).then(res.send.bind(res)) 应该可以工作。
  • @jfriend00 承诺应始终解析为字符串。

标签: node.js express promise


【解决方案1】:

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

res.send.bind(res)

【讨论】:

  • 感谢您的回复。我将 then(res.send) 替换为 then(res.send.bind(res)) 并且仍然遇到相同的错误。
  • 这个答案肯定至少是问题的一部分。换句话说,这确实必须按照此处描述的方式进行修复。这可能不是整个问题,也可能不是导致您遇到错误的第一件事,但这是一个需要应用的修复程序。
  • 我在测试中调整了其他一些我在运行测试时忘记撤消的东西,但是在撤消并进行更改时,您的答案是正确的。非常感谢!
猜你喜欢
  • 2011-07-19
  • 2016-08-07
  • 2016-05-20
  • 2015-09-16
  • 2018-01-15
  • 2017-08-13
  • 1970-01-01
  • 2017-06-10
  • 1970-01-01
相关资源
最近更新 更多