我正在尝试hapi.js,并希望将hapi与猫鼬连接。
但是每当我去这条路线时,它都会说Internal Server Error
快速设置:
我的文件结构是这样的:(我没有包含与此问题无关的东西)
/app.js
/node_modules
/models
/Product.js
/routes
/product-page
/product.js
/views
/product
/product.html
在我的app.js里面是这个。
const Hapi = require('hapi');
const routes = require('./routes');
const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/hapidb', { useNewUrlParser: true })
.then(() => console.log('MongoDB connected...'))
.catch(err => console.error(err));
const server = Hapi.server({
port: 3000,
host: 'localhost'
});
const init = async () => {
await server.start();
console.log(`Server running at: ${server.info.uri}`);
// Home Route
server.route(routes);
await server.register(require('vision'));
server.views({
engines: {
html: require('handlebars')
},
relativeTo: __dirname,
path: 'views',
partialsPath: 'views/partials'
});
};
process.on('unhandledRejection', (err) => {
console.log(err);
process.exit(1);
});
init();
如您所见,mongoose.connect
正在工作,当我在终端中键入node app.js
时,MongoDB connected...
正在获得输出。
现在,我为该架构创建了一个models/Product.js
,这就是该架构:
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
var ProductSchema = new Schema({
name: String
});
module.exports = mongoose.model('Product', ProductSchema);
,现在位于我的路线product.js文件中。这是设置:
const Product = require('../../model/Product')
module.exports = [
{
method: 'GET',
path: '/product',
handler: (request, h) => {
//something is not working here
Product.find(function(error, product) {
if (error) {
console.error(error);
}
return h.view('product/product.html')
})
}
}
]
现在我尝试去http://localhost:3000/product
,但是当我去那里时,它说:
{
"statusCode": 500,
"error": "Internal Server Error",
"message": "An internal server error occurred"
}
终端内部是这个Debug: internal, implementation, error
Error: handler method did not return a value, a promise, or throw an error
我做了什么:
我去我的终端并输入mongo
和show dbs
,我发现hapidb
数据库不在这里,所以我想也许是问题所在。
所以我去打了use hapidb
和db.products.insert({name: "Television"})
我尝试重新启动node app.js
并转到http://localhost:3000/product
。仍然无法正常工作。
现在我尝试将路由处理程序略微更改为此
handler: (request, h) => {
//I added an empty object to find all product
Product.find({}, function(error, product) {
if (error) {
console.error(error);
}
return h.view('product/product.html')
})
}
这就是我能想到的。如果我只返回return h.view('product/product.html')
,它正在工作。但是在代码中使用Product.find
时,它不起作用。
请帮助
答案 0 :(得分:2)
尝试像这样返回Product.find:
handler: (request, h) => {
return Product.find({}, function(error, product) { // <-- This line
if (error) {
console.error(error);
}
return h.view('product/product.html')
})
}