使用MySQL / Mongo后端的Next.js

时间:2018-01-29 20:17:12

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

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

它使用Sequelize和Mongoose并且完全可以游泳。

我今天一直在关注Next.js并且给我留下了深刻的印象,我对React的一个烦恼实际上是它有多少引导以及实现简单的代码需要多少代码。 Next.js似乎为我解决了一些问题,所以我愿意接受它。

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

e.g。 ./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)
    })
})

./页/ 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,这似乎是浪费大量资源!

任何帮助,非常感谢。

2 个答案:

答案 0 :(得分: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的值并使用该值。

答案 1 :(得分:0)

很明显,当请求到达模板时,它已经改变了一点!即,它嵌套在另一个请求对象中。

req.req.mongodb和req.req.mysqldb都运行正常:)。