Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 节点:将函数传递给承诺_Node.js_Express_Promise - Fatal编程技术网

Node.js 节点:将函数传递给承诺

Node.js 节点:将函数传递给承诺,node.js,express,promise,Node.js,Express,Promise,我是Node的新手,从未在前端web开发或Javascript方面做过很多工作,但我正在尝试做一些简单的前端任务,并且发现了一些我不理解的错误。我已经读了很多关于我所看到的错误的帖子,但是很多都没有被接受的答案,还有一些似乎与之无关。我还阅读了David Herron在Node.js Web开发书中关于承诺的章节几次,因此我认为我理解承诺背后的想法,但我对我看到的一些错误感到困惑 我正在运行一个express.js服务器。我在文件query.js中有一个查询方法,它(简化)接受一个键并返回一个值

我是Node的新手,从未在前端web开发或Javascript方面做过很多工作,但我正在尝试做一些简单的前端任务,并且发现了一些我不理解的错误。我已经读了很多关于我所看到的错误的帖子,但是很多都没有被接受的答案,还有一些似乎与之无关。我还阅读了David Herron在Node.js Web开发书中关于承诺的章节几次,因此我认为我理解承诺背后的想法,但我对我看到的一些错误感到困惑

我正在运行一个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文件,其中包含express服务器的代码。 一种方法有效,另一种方法无效,我不知道有什么区别。以下是预期的工作方式:

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)
    }
})
我明白了


有人知道为什么一个console.log(以字符串作为参数)可以工作,而res.send(也以字符串作为参数)不能工作吗?我觉得这很奇怪,特别是因为res.send只在promise结构之外工作,而console.log在任何地方都可以工作。

我认为这是一个绑定问题。这样写
res.send
将使函数与
res
分离。尝试以下操作以保留绑定:

res.send.bind(res)

第110:17行中的内容提示:该问题与此相关。您正在传递该方法,但丢失了将应用该方法的对象。使用调用
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)。然后(res.send.bind(res))
应该可以工作。@jfriend00承诺应该总是解析为字符串。感谢您的响应。我用then替换了then(res.send)(res.send.bind(res))我仍然会遇到同样的错误。这个答案肯定至少是问题的一部分。换句话说,这确实需要按照这里描述的方式进行修复。这可能不是整个问题,也可能不是导致错误的第一个错误,但这是一个需要应用的修复。我在测试中调整了其他一些内容在运行测试时,我忘记撤消,但是在撤消并进行更改后,您的答案是正确的。非常感谢!
res.send.bind(res)