【问题标题】:Next.js with MySQL/Mongo backend带有 MySQL/Mongo 后端的 Next.js
【发布时间】:2018-07-08 14:58:19
【问题描述】:

我有一个现有的 Node.js/Express 应用程序,它连接到 2 个独立的数据库,它有一个用于所有关系数据的 MySQL 数据库和一个用于非关系垂直数据的 MongoDB 存储。

它使用 Sequelize 和 Mongoose 并且运行得非常流畅。

我今天一直在看 Next.js,我印象非常深刻,我对 React 的一个小毛病实际上是有多少引导程序以及实现简单的事情需要多少代码。 Next.js 似乎为我解决了其中一些问题,所以我愿意接受它。

第一个问题 - 是否可以将 Next.js 连接到现有数据库并直接在视图中读取它们的对象?

例如./server.js:

const mongoDb = mongoose.connect(configDB.url); // MongoDB connection
const models = require('./models'); // Sequelize connection

app.prepare().then(() => {
    server.use((req, res, next) => {
        req.mongodb = mongoDb
        req.mysqldb = models
        // Logging req.mysqldb/req.mongodb at this point gives the correct result.
        next()
    });

    server.get('*', (req, res) => {
        return handle(req, res)
    })
})

./pages/index.js:

Index.getInitialProps = async function(req) {
    console.log(req.mongodb);
    console.log(req.mysqldb)

    // Example of what I want: req.mysqldb.users.findAll()....... to populate collection for this view
}

当控制台语句在 index.js 页面中执行时,它们被记录为未定义。

理想情况下我想直接在 next.js 模板中使用 objects/ORM 层,我不想在内部调用自己的 API,这似乎是一种巨大的资源浪费!

任何帮助,不胜感激。

【问题讨论】:

    标签: node.js mongodb express sequelize.js next.js


    【解决方案1】:

    仅供参考。 getInitialProps 被传入一个对象,其中一个键是req。因此,您应该改为执行以下操作

    // add the curly braces around req
    Index.getInitialProps = async function({ req }) {
        // code
    }
    

    这被称为Function Parameter Destructuring,是在 ES6 中引入的。这完成的类似于下面的代码

    Index.getInitialProps = async function(_ref) {
        var req = _ref.req;
    }
    

    意思是,它获取传递的对象的req 的值并使用该值。

    【讨论】:

      【解决方案2】:

      显然,当请求到达模板时,它已经发生了一些变化!也就是说,它嵌套在另一个请求对象中。

      req.req.mongodb 和 req.req.mysqldb 都可以正常工作:)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-10-22
        • 2016-12-15
        • 2021-08-30
        • 2021-04-17
        • 1970-01-01
        • 1970-01-01
        • 2019-01-10
        相关资源
        最近更新 更多