Heim  >  Fragen und Antworten  >  Hauptteil

javascript - Verwenden Sie nodejs, um Datenbankdaten an die Rezeption zu übertragen. Es sind Daten in der Datenbank vorhanden und die Verbindung ist erfolgreich. Warum wird jedoch ein leeres Array erhalten?

1.api.js

2.db.js


3.vue

4. Datenbank

Das Ergebnis ist:

Das erhaltene Ergebnis ist ein leeres Array, aber sowohl der Link als auch die Datenbank sind korrekt. Warum ist das so? ? ?

ringa_leeringa_lee2663 Tage vor1106

Antworte allen(4)Ich werde antworten

  • 滿天的星座

    滿天的星座2017-06-05 11:10:50

    这个问题的症结如 @cheesekun 所说,是因为:mongoose会自动帮把 model 中的集合名(第一个参数)改为复数形式了。

    这里我给出了自己的试验过程,并在下面提供了两种解决方案

    根据题主的意思首先创建了一个简单的项目

    app.js

    const express = require('express');
    const app = express();
    
    app.use('/api',require('./router/api'));
    
    app.listen(3000, () => {
        console.log('Server is running!');
    });

    module/db.js

    const mongoose = require('mongoose');
    
    mongoose.connect('mongodb://127.0.0.1:27017/test');
    mongoose.connection
        .on('connected', _ => console.log('mongodb connect successed'))
        .on('error', _ => console.log('mongodb connect failed'))
        .on('disconnected', _ => console.log('mongodb connect disconnected'));
    
    const Schema = mongoose.Schema;
    const listSchema = new Schema({
        name: String,
        age: Number
    });
    
    const List = mongoose.model('list', listSchema);
    
    module.exports = {
        List
    }

    router/api.js

    const express = require('express');
    const db = require('../module/db');
    
    const router = express.Router();
    
    router.get('/list', (req, res) => {
        db.List.find((err,data)=>{
            if(err){
                console.log(err);
            }else{
                res.json(data);
            }
        });
    });
    
    module.exports = router;

    通过 可视化工具 连接到 mongodb 预先在 test 数据库 list 集合下插入了一条文档

    发现问题

    通过浏览器直接访问得到了 同题主一样的空数组

    寻找原因

    尝试插入一条文档到集合中

    module/db.js 底部通过代码插入一条数据

    const list = new List({
        name: '代码创建的数据',
        age: 1
    });
    list.save(function (err, data) {
        console.log(data);
    });
    

    重新运行,并通过浏览器访问,返回了通过代码插入的数据

    此时通过 可视化工具 可以发现 多出了 lists 这个集合,而我们通过代码插入的数据就在其中

    解决方案

    如不明确指定集合名,mongoose会自动帮把 model() 中的第一个参数改为复数形式后作为集合名

    提供两个解决方案,都是指定集合名

    第一种:

    给 mongoose.model() 传递第三个参数来指定集合名

    const List = mongoose.model('list', listSchema,'list');

    第二种:

    给 Schema 传递第二个配置项来指定集合名

    const listSchema = new Schema({
        name: String,
        age: Number
    },{
        collection: 'list'
    });

    Antwort
    0
  • 伊谢尔伦

    伊谢尔伦2017-06-05 11:10:50

    我赌5毛。
    mongoose定义model时,会给表名自动加s,而你的login和list都没有加s
    调用不到数据库
    这是我之前写的博客,最下面有提到
    mongoose深海巨坑

    Antwort
    0
  • 天蓬老师

    天蓬老师2017-06-05 11:10:50

    你在res.send(data)加个console.log(data),看看可有结果

    Antwort
    0
  • 某草草

    某草草2017-06-05 11:10:50

    首先直接看控制台里xhr返回是否有值,如果有值就是你获取办法不对。

    如果没有就是你压根没有把值发出去,说明问题出现在后端,再往回排查。

    Antwort
    0
  • StornierenAntwort