【问题标题】:Express/Node.js error: Reference Error: Res is not definedExpress/Node.js 错误:Referenceerror:Res 未定义
【发布时间】:2017-05-01 16:30:20
【问题描述】:

我现在正在尝试为我的小组的应用程序创建一个基本的 CRUD 应用程序,但我在基本行上遇到了一些问题。为了构建我的 crud 应用程序,我目前正在使用 node.js、express 和 mongodb。我的部分代码遇到了一些问题,我想知道您是否可以为我指明正确的方向。

(这是一个冗长的问题。我已尽力将其格式化,以免在阅读时灼伤您的眼睛……如果阅读困难,请见谅)

上下文: 供参考,我正在使用这个:

https://zellwk.com/blog/crud-express-mongodb/, currently on "Showing quotes to users" 

我的问题: 每次我初始化 res.render(view, locals) 我的节点服务器都会崩溃。这是我得到的错误。

res.render(view, locals)
    ReferenceError: res is not defined
        at Object.<anonymous> (C:\Users\hcqph\xx\xcxx\server.js:35:1)
        at Module._compile (module.js:570:32)
        at Object.Module._extensions..js (module.js:579:10)
        at Module.load (module.js:487:32)
        at tryModuleLoad (module.js:446:12)
        at Function.Module._load (module.js:438:3)
        at Module.runMain (module.js:604:10)
        at run (bootstrap_node.js:393:7)
        at startup (bootstrap_node.js:150:9)
        at bootstrap_node.js:508:3

我的代码: 到目前为止,这就是我对 server.js 所拥有的。现在,每当我尝试导入我的 index.ejs 文件以及尝试导入以下行时,我都会遇到错误:

res.render(views, locals)

这是我的 server.js 代码

    const express = require('express');
    const bodyParser = require('body-parser')
    const app = express();
    const MongoClient = require('mongodb').MongoClient

  var db

    MongoClient.connect('mongodb://omittedforprivacy', (err, database) => {
        if (err) return console.log(err)
        db = database

        app.listen(3000, () => {
            console.log('connected to mongoDB successfully. now listening on port 3000 ')
        })

    })

    /* -------- for team documentation --------
    BODYPARSER makes it possible to handle reading data from form element in index.html.  URLENCODED method within body-parser tells body-parser to extract data from form element and add them to the body element property in request object.
    ------------------------------------------------ */ 
    app.use(bodyParser.urlencoded({extended: true}))

    //set 'ejs' template engine, and default extension is ejs
    app.set('view engine', 'ejs')

    //CAN'T FIGURE OUT WHY THIS ISN'T WORKING
    res.render(views, locals)

    /* -------- for team documentation --------
    => = replacement for function

    app.get hand a GET request (read operation)
    ------------------------------------------------ */
    app.get('/', (req, res) => {
        //serves index.html back to browser
        res.sendFile(__dirname + '/index.html')

        //gets list of trips from mlab.com
        var cursor = db.collection('trips').find()

        //retrieves list of trips retrieved from mlab
        db.collection('trips').find().toArray(function(err, results) {
            if(err) return console.log(err)

            //renders index.ejs
            res.render('index.ejs', {trips:results})
        })
    })



    /* app.post handles a create request */
    app.post('/trips', (req, res) => {
        db.collection('trips').save(req.body, (err, result) =>{
            if (err) return console.log(err)

            console.log('saved to database')
            res.redirect('/') //causes browser to reload
        })
    })

如果您能提供任何帮助来帮助我进行故障排除,我们将不胜感激。在过去的几个小时里,我一直坚持这一点。我以为 res 已经被 express 定义了?为什么我被告知要重新定义 res ?

================================================ =============================== 编辑:

现在我收到以下错误:Error: Can't set headers 发送后。这就是我现在拥有的:

//getting this to render? 
app.get('views/', (req, res, views, local) =>{ res.render(views,local) })

最近的编辑: 感谢其他人的意见和建议,我意识到我需要更改位置并实际明确定义 res.render。

我现在遇到以下调试错误:

Error: Can't set headers after they are sent.
    at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:357:11)

我已将代码更改如下:

app.get('/', (req, res) => {
    //serves index.html back to browser
    res.sendFile(__dirname + '/index.html')

    //gets list of trips from mlab.com
    var cursor = db.collection('trips').find()

    //retrieves list of trips retrieved from mlab
    db.collection('trips').find().toArray(function(err, results) {
        if(err) return console.log(err)

        //renders index.ejs
        res.render('index.ejs', {trips:results})
    })
})

//set 'ejs' template engine, and default extension is ejs
app.set('view engine', 'ejs')

//getting this to render? 
app.get('views/', (req, res) =>{
    res.render(views,local)
})


/* app.post handles a create request */
app.post('/trips', (req, res) => {
    db.collection('trips').save(req.body, (err, result) =>{
        if (err) return console.log(err)

        console.log('saved to database')
        res.redirect('/') //causes browser to reload
    })
})

我哪里出错了?

================================================ ========================= 编辑2:我能够克服一个调试错误并进入下一个。我完全删除了 res.render 并通过重新排列我的一些代码来修复我的标题问题。这是我最近的:

/* -------- for team documentation --------
BODYPARSER makes it possible to handle reading data from form element in index.html.  URLENCODED method within body-parser tells body-parser to extract data from form element and add them to the body element property in request object.
------------------------------------------------ */ 
app.use(bodyParser.urlencoded({extended: true}))

//set 'ejs' template engine, and default extension is ejs
app.set('view engine', 'ejs')

/* -------- for team documentation --------
=> = replacement for function

app.get hand a GET request (read operation)
------------------------------------------------ */
app.get('/', (req, res) => {
    //serves index.html back to browser
    res.sendFile(__dirname + '/index.html')

    //gets list of trips from mlab.com
    var cursor = db.collection('trips').find()

    //retrieves list of trips retrieved from mlab
    db.collection('trips').find().toArray(function(err, results) {
        if(err) return console.log(err)

        //renders index.ejs
        res.render('views/index.ejs', {trips:results})
    })
})



/* app.post handles a create request */
app.post('/trips', (req, res) => {
    db.collection('trips').save(req.body, (err, result) =>{
        if (err) return console.log(err)

        console.log('saved to database')
        res.redirect('/') //causes browser to reload
    })
})

现在我正在解决以下问题:

Error: Failed to lookup view "views/index.ejs" in views direct                      ory "C:\Users\hcqph\gitprojects\crudbeta\views"

【问题讨论】:

  • res.render(views, locals) 就像它说的那样,res 没有定义,它不在get 或post 中。 res 不是 express 的全局变量。 res 表示简称响应。
  • 不是 100% 确定,但也许你需要在你的 res.render() 调用你的 app.get('/') 函数之后调用 res.end();。我不确定res.render() 是否调用res.end()。如果没有,那么下次您在 /views 端点中调用 res.render 时,它会尝试发送另一个响应并且第一个响应尚未关闭。

标签: node.js mongodb express


【解决方案1】:
  1. 您可以在根级别调用 app.render,而 res.render 只能在路由/中间件内调用。
  2. app.render 总是在回调函数中返回 html,而 res.render 只有在您将回调函数指定为第三个参数时才会这样做。如果您在没有第三个参数/回调函数的情况下调用 res.render,则呈现的 html 会以状态码 200 发送到客户端。

看看下面的例子。

app.render

app.render('index', {title: 'res vs app render'}, function(err, html) {
    console.log(html)
});

res.render 不带第三个参数

app.get('/render', function(req, res) {
    res.render('index', {title: 'res vs app render'})
})

res.render 带第三个参数

app.get('/render', function(req, res) {
    res.render('index', {title: 'res vs app render'}, function(err, html) {
        console.log(html);
        res.send('done');
    })
})
  1. res.render 在内部使用 app.render 来渲染模板文件。
  2. can't set headers 表示无法进入体内。
  3. res.render() 函数编译你的模板(请不要使用 ejs),在那里插入本地,并从这两个东西中创建 html 输出。

//这里设置所有模板都位于/views目录

app.set('views', __dirname + '/views');

// here you set that you're using `ejs` template engine, and the
// default extension is `ejs`
app.set('view engine', 'ejs');

// here you render `local` template
response.render("local", {local: local_json});

所以,模板路径是views/(第一部分)+local(第二部分)+.ejs(第三部分)===views/local.ejs

【讨论】:

  • 非常感谢@King Reload!我已经更新了我的堆栈问题。我有一个新的调试问题.. 它说我在发送后无法设置标题。我认为正在发生的事情是我正在尝试发送 res.render(index.ejs).. 但是如何在不先渲染视图/本地的情况下将其加载到 index.ejs?
  • @Clark 将views/local 放在index.ejs 下方?你只需要有res,所以你可以把值放在app.get('/', (req, res) =&gt; {...?
  • 感谢您的回复。我知道我现在哪里出错了。这说得通。我可以再问一个问题吗?我真的很感激帮助。如果我认识你,我会给你买一杯咖啡。如果我收到此错误是什么意思:错误:无法在视图目录中查找视图“views/index.ejs”。为什么会出现这个错误?
  • 你可能在错误的目录中,我宁愿喝巧克力牛奶;P 咖啡对我的牙齿有害,我看到问题已经解决了吗?
  • 哈哈,巧克力牛奶就是这样。我更改了目录,但我回到过去的设置标题调试错误。我设置问题已解决,因为我解决了最初的问题,但我还有更多@_@ 如果我为这个新的调试问题创建一个新的 stackoverflow 问题是否合适?我不是 100% 确定这里的礼仪
【解决方案2】:

它不起作用,因为 res 在代码中当时没有定义。如果您在 app.get('/') 方法下方查看几行,则 res 是在该功能块中定义的。您需要创建另一个端点(或使用现有的 app.get 端点) - 例如,

app.get('/someendpoint', function(req, res) {
    // use res here
    // also must have views and local defined
    res.render(views, local);
});

express 将在声明服务器端点时将请求和响应对象传递给您的回调函数。

【讨论】:

  • 感谢@Bradstell。我对其进行了更改,以便 app.get 低于我定义的 app.get('/') 方法,但现在我收到以下错误:错误:发送后无法设置标题。这就是我现在所拥有的://让这个渲染? app.get('views/', (req, res, views, local) =>{ res.render(views,local) })
  • 这里的视图和本地是什么?我认为 express/nodejs 不会将这两个变量传递给您的回调函数。只有req, res 被传递到您的回调函数中。当您尝试向客户端发送两次响应时,会发生错误 cant set headers after they are sent。您只能设置一次标题。我需要查看您的代码以确定发生这种情况的确切位置。
  • 嗨@BradStell,我已经更新了我的堆栈问题。我已经改变了它 - 我认为正在发生的事情是我正在尝试发送 res.render(index.ejs).. 但是我如何让 index.ejs 加载而不先渲染视图/本地?
猜你喜欢
  • 2018-11-07
  • 1970-01-01
  • 2013-02-18
  • 2015-01-30
  • 1970-01-01
  • 2014-09-26
  • 2019-05-13
  • 1970-01-01
  • 2014-05-30
相关资源
最近更新 更多