【发布时间】: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 时,它会尝试发送另一个响应并且第一个响应尚未关闭。