使用 node.js 从 Mongodb 获取数据时,浏览器会一直加载
Posted
技术标签:
【中文标题】使用 node.js 从 Mongodb 获取数据时,浏览器会一直加载【英文标题】:browser keeps loading forever when getting data from Mongodb using node.js 【发布时间】:2021-12-14 20:15:50 【问题描述】:我试图制作一个非常简单的 MEAN STACK 应用程序,它只从 mongodb 请求中获取书籍名称、价格,但是当我键入 url 来获取数据时,它只会在浏览器中永久加载 这是主要代码
const express = require("express") ;
const mongoose = require("mongoose") ;
cors = require('cors') ;
const path = require('path') ;
bodyParser = require('body-parser') ;
const app = express() ;
const port = 3000 ;
const booksRoute = require('./routes/api') ;
// enable cross-origin sharing and ...
app.use('/api',booksRoute) ;
app.use(cors()) ;
app.use(express.static(path.join(__dirname,'dist/smart-bookshelf'))) ;
app.use('/',express.static(path.join(__dirname,'dist/smart-bookshelf'))) ;
app.use(bodyParser.json()) ;
app.use(bodyParser.urlencoded(
extended:false
)) ;
mongoose.connect('localhost:27017/books',()=>console.log("connected successfully to database !")) ;
const server = app.listen(3000,()=>console.log("server is working correctly on port : "+port)) ;
// error handler
app.use(function (err, req, res, next)
console.error(err.message); // Log error message in our server's console
if (!err.statusCode) err.statusCode = 500; // If err has no specified error code, set error code to 'Internal Server Error (500)'
res.status(err.statusCode).send(err.message); // All HTTP requests must have a response, so let's send back an error with its status code and message
);
这是路线代码
mongoose = require('mongoose') ;
const express = require('express') ;
const BookModel = require('../models/bookModel');
const booksRoute = express.Router() ;
booksRoute.route('/').get((req,res)=>
BookModel.find((error,data)=>
if (error)
console.log("an error accured while retrieving data !") ;
else
res.json(data) ;
)
) ;
module.exports = booksRoute ;
https://github.com/mohamedalimani/bookshelf
【问题讨论】:
【参考方案1】:在您的路由处理程序中,如果您遇到错误,您不会发送任何响应,因此浏览器会在那里等待很长时间等待返回结果(最终,它会超时)。除非您将错误发送给错误处理程序,否则您的错误处理程序不会自动获取错误。
我建议将您的路由处理程序更改为:
booksRoute.route('/').get((req, res, next) =>
BookModel.find((error,data)=>
if (error)
next(error);
else
res.json(data) ;
)
);
【讨论】:
我接受了您的建议,这不是答案,但我认为我应该在执行函数后修改代码以获取错误消息,结果发现问题出在 mongodb url 解析器中。应该是这个 mongoose.connect('mongodb://localhost:27017/books' 而不是 mongoose.connect(localhost:27017/books' .. 它有效。谢谢你的灵感 @MohamedAliMani - 那么,您对.connect()
操作没有错误处理?那将很难看到这个问题。很难强调始终以某种方式检测、记录和处理所有服务器端错误是绝对必要的,这也将使您的编码生活变得不那么困难。
是的,这就是为什么我没有注意到 mongo url 中的错误。【参考方案2】:
解决了:问题出在这行代码中 mongoose.connect('localhost:27017/books',()=>console.log("connected successfully to database !")) ; 那是错误的数据库网址。应该是 'mongodb://localhost:27017/books'
【讨论】:
以上是关于使用 node.js 从 Mongodb 获取数据时,浏览器会一直加载的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 mongoose 从 mongoDB 中获取一定数量的对象? (Node.js)