q-io/fs 在快速请求处理程序中

q-io/fs in express request handler

我试图解决节点 js 中需要 rad 文件的编程问题。 使用 qio 执行此操作的正确方法是什么。

这是我的程序

var express = require('express')
var qfs = require('q-io/fs')
var q = require('q')
var fs = require('fs')
var app = express()
app.get('/books', function(req, res){
  qfs.read(process.argv[3])
  // .then( function(buf){res.json(JSON.parse(buf))})
  // .done()
 .then(res.send).done()
 /*  .then(null, function(abc, err){
            res.json(err)
            console.log("Error handler")
            res.status(500)
          })*/
  })
 app.listen(process.argv[2])

我知道我可以同步读取文件,下面的代码也可以工作

qfs.read(process.argv[3])
.then( function(buf){res.json(JSON.parse(buf))})
.done()

但主要代码出错,我理解这是因为应用程序对象超出范围,因为请求处理程序可能已经 returned。

/home/ubuntu/mahesh/node_tries/node_modules/q/q.js:155
                throw e;
                      ^
TypeError: Cannot read property 'req' of undefined
    at send (/home/ubuntu/mahesh/node_tries/node_modules/express/lib/response.js:103:17)
    at _fulfilled (/home/ubuntu/mahesh/node_tries/node_modules/q/q.js:834:54)
    at self.promiseDispatch.done (/home/ubuntu/mahesh/node_tries/node_modules/q/q.js:863:30)
    at Promise.promise.promiseDispatch (/home/ubuntu/mahesh/node_tries/node_modules/q/q.js:796:13)
    at /home/ubuntu/mahesh/node_tries/node_modules/q/q.js:604:44
    at runSingle (/home/ubuntu/mahesh/node_tries/node_modules/q/q.js:137:13)
    at flush (/home/ubuntu/mahesh/node_tries/node_modules/q/q.js:125:13)

这里发生了什么??当调用 res.end 时,express.js return 的处理程序在什么时候执行?

有点晚了,但我自己偶然发现了这个问题,想帮助以后遇到这个问题的人。

您的程序在 response.js 中失败的那一行是:

var req = this.req;

当调用res.send()时,调用函数send时调用的是res的上下文(所以"this"是res),this.req是请求对象

但是,当您将函数作为变量传递给 promise 时,它​​失去了上下文并变成了一个函数。因此,当它被调用时,"this" 未定义并且 this.req 成为错误。因此,要解决您的问题,请替换

.then(res.send).done()

.then(books => res.send(books)).done()