【问题标题】:I'm able to connect to MongoDB, but not seeing any data from my collections我能够连接到 MongoDB,但没有看到我的集合中的任何数据
【发布时间】:2021-11-27 01:05:42
【问题描述】:

我已经设置好所有东西,并且看到我连接成功,但是当尝试使用集合中的数据时,什么都没有。

server.js

const express = require('express');
const connectDB = require('./config/db');

const app = express();

connectDB();

app.get('/', (req, res) => res.send('API Running'));

app.use(function (req, res, next) {
    res.header('Access-Control-Allow-Origin', '*'); // update to match the domain you will make the request from
    res.header(
        'Access-Control-Allow-Headers',
        'Origin, X-Requested-With, Content-Type, Accept'
    );
    next();
});

app.use(express.json({ extended: false }));

app.use('/api/skateboard_tricks', require('./src/api/skateboard_tricks'));
app.use(
    '/api/general_skate_data/trick_type',
    require('./src/api/general_skate_data')
);

const PORT = process.env.PORT || 5000;

app.listen(PORT, () => {
    console.log(`Server started on port: ${PORT}`);
});

config/db.js

const mongoose = require('mongoose');
const config = require('config');
const db = config.get('mongoURI');

const connectDB = async () => {
    try {
        await mongoose.connect(db, {
            useNewUrlParser: true,
            useUnifiedTopology: true,
            useCreateIndex: true,
        });

        console.log('MongoDB connected...');
    } catch (err) {
        console.error(err.message);
        process.exit(1);
    }
};

module.exports = connectDB;

src/api/skateboard_tricks.js

const express = require('express');
const router = express.Router();
const skate_tricks = require('../models/SkateTrick');

// @route   GET api/skateboard_tricks
// @desc    skateboard tricks data
// @access  public

router.get('/', (req, res) => {
    skate_tricks.find({}, (err, result) => {
        if (err) {
            res.send(err);
        } else {
            const trick_list = result[0];
            res.send(trick_list.tricks);
        }
    });
});

module.exports = router;

应用中的 API 调用

    const [trickList, setTrickList] = useState([]);
    const [loading, setLoading] = useState(false);

    const sfsApiCall = axios.create({
        baseURL: 'http://localhost:5000/',
    });

    const getTrickData = async () => {
        try {
            const data = await sfsApiCall.get('api/skateboard_tricks').then((res) => {
                console.log(res);
                setTrickList(res.data);
            });
            setLoading(true);
        } catch (err) {
            console.error(err.message);
        }
    };
    
    useEffect(() => {
        getTrickData();
    }, [loading]);

这曾经可以工作一段时间,我现在正在重新访问代码,但它不再工作了。不知道发生了什么。

邮递员截图: https://i.stack.imgur.com/gIcok.png

提前致谢!

编辑:我创建了一个单独的应用程序来隔离 API 连接文件,看起来我遇到了网络错误。这是来自邮递员:

GET http://localhost:5000/api/skateboard_tricks
Error: read ECONNRESET
Request Headers
User-Agent: PostmanRuntime/7.28.4
Accept: */*
Postman-Token: 9da940c6-62bc-437e-bb07-d0457368264a
Host: localhost:5000
Accept-Encoding: gzip, deflate, br
Connection: keep-alive

此错误显示在控制台中

GET http://localhost:5000/api/skateboard_tricks net::ERR_CONNECTION_REFUSED 200

这可能是 CORS 问题,但即使是我也不清楚的故障排除。希望这可以帮助有人帮助我。

【问题讨论】:

  • 控制台等有什么错误吗?
  • 我正要问,浏览器检查器中网络选项卡中的网络调用的响应是什么?
  • @RobertTerrell 控制台或网络选项卡中没有错误。我有一个显示响应数据的 console.log,它给了我 200 代码,但数据字段中没有。
  • @frishi 网络选项卡中没有错误。我得到一个 200 代码,但响应没有数据。
  • 请尝试在 API 调用中的 else 块中添加 console.log(trick_list),看看是否有任何数据通过。

标签: javascript node.js reactjs mongodb express


【解决方案1】:

如果你在本地测试,你可以使用一些浏览器扩展来禁用 CORS 限制:

  1. 对于 Chrome,https://chrome.google.com/webstore/detail/allow-cors-access-control/lhobafahddgcelffkeicbaginigeejlf?hl=en

  2. 对于 Firefox,https://addons.mozilla.org/en-US/firefox/addon/cors-unblock/

  3. Safari 可以查看Develop > Disable Cross-Origin Restrictions

这些扩展将帮助您完全禁用 CORS,并且您可以明智地检查 API 是否以您期望的方式返回数据。

请注意,这纯粹是出于开发和测试目的。您应该使用正确的 CORS 配置设置您的 API,然后在 UI 的请求中传递正确的标头。

见:http://expressjs.com/en/resources/middleware/cors.html

【讨论】:

    【解决方案2】:

    好的,无论出于何种原因,我都无法从skateboard_tricks.js 文件中的技巧对象中获取数据。在调用函数以在我的应用程序中提取数据时,我必须指定技巧对象(请参阅 OP 进行比较)。

    const express = require('express');
    const router = express.Router();
    const skate_tricks = require('../models/SkateTrick');
    
    // @route   GET api/skateboard_tricks
    // @desc    skateboard tricks data
    // @access  public
    
    router.get('/', (req, res) => {
        skate_tricks.find({}, (err, result) => {
            if (err) {
                res.send(err);
            } else {
                const trick_list = result[0];
                res.send(trick_list);
            }
        });
    });
    
    module.exports = router;
    

    注意res.send(trick_list) 不再与.tricks 绑定的位置。以下是 API 调用中的代码:

        const [trickList, setTrickList] = useState([]);
        const [loading, setLoading] = useState(false);
    
        const sfsApiCall = axios.create({
            baseURL: 'http://localhost:5000/',
        });
    
        const getTrickData = async () => {
            try {
                const data = await sfsApiCall.get('api/skateboard_tricks').then((res) => {
                    setTrickList(res.data.tricks);
                });
                setLoading(true);
            } catch (err) {
                console.error(err.message);
            }
        };
        
        useEffect(() => {
            getTrickData();
        }, [loading]);
    

    请注意,我现在在 setTrickList 中引用 res.data.tricks。我在这个愚蠢的错误上花了 2 天时间,所以我希望这篇文章可以帮助其他人。

    感谢所有插话的人。我觉得这一切仍然有助于解决问题。这段代码最后一次工作是在 8 个月前,所以当我更新我所有的 npm 包时,很可能其中一个依赖项已经更新,需要这个解决方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多