使用 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 获取数据时,浏览器会一直加载的主要内容,如果未能解决你的问题,请参考以下文章

从Node JS中的MongoDB查询中获取数据

如何使用 mongoose 从 mongoDB 中获取一定数量的对象? (Node.js)

通过node.js从mongodb获取数据

通过node.js从mongodb获取数据

如何使用node js,reactjs,express从实际网页中的mongodb中获取数据

从 mongodb 服务器上的数据创建 d3.js 图