在nuxt中使用mongodb

Mr.*_*yyy 4 mongodb vue.js nuxt.js

我正在尝试使用 MongoDB 进行 Vuex 不适合的长期复杂存储。

我已经安装并运行了 MongoDB,并且安装了 mongoose 包。

在我的插件文件夹中,我创建了一个脚本来初始化模块并将其导出:

插件/mongoose.js

const mongoose = require('mongoose');

mongoose.connect('mongodb://localhost/users', { useNewUrlParser: true });

export default({ app }, inject) => {

    inject('mongoose', mongoose);

}
Run Code Online (Sandbox Code Playgroud)

然后在我的 nuxt.config.js 中,我声明该模块并将其设置为仅服务器端。

nuxt.config.js

...
plugins: [
    { src: '~/plugins/mongoose.js', mode: 'server' },
],
...
Run Code Online (Sandbox Code Playgroud)

最后,在我的一个页面中,我尝试通过一种方法访问它。

页面/users.vue

<template>
    <button @click="addUser('joe')">Joe</button>
</template>

<script>
    export default {
        methods: {
            addUser(name) {
                console.log(this.$mongoose);
            }
        }
    }
</script>
Run Code Online (Sandbox Code Playgroud)

当我单击控制台中的按钮时,我得到cannot stringify a function changecannot stringify a function name。我无法判断这是否有效,但我无法使用该mongoose对象的任何属性。

尽管这个主题看起来相当常见,但似乎没有太多结构化信息。

Jas*_*nis 6

您可以创建自己的 serverMiddleware,然后在 asyncData 中调用它。简单来说,我有以下内容:

// nuxt.config.js
const bodyParser = require('body-parser')

export default {
  ...,
  serverMiddleware: [
    bodyParser.json(),
    { path: '/db-api', handler: '~/api/db-connection' },
  ],
}
Run Code Online (Sandbox Code Playgroud)

在 db-connection 中你可以添加类似的内容:

import {
  getOneDocument,
} from '../utils/db-helper'

export default async function (req, res, next) {
  const doc = await getOneDocument('my-one-and-only-collection', req.body)

  res.end(JSON.stringify(doc))
}
Run Code Online (Sandbox Code Playgroud)

然后在 asyncData 中你可以执行如下操作:

async asyncData (context: any) {
  const reqq = await axios.post(
    `${url}/db-api`,
    {
      'sys.id': '2J2a1nQhmTYbHML2si8gmW'
    }
  )
  return {
      thatOneAndOnlyRecord: reqq.data,
  }
}
Run Code Online (Sandbox Code Playgroud)

您需要确保任何复杂的查询也发生在您的中间件内部,因为您要为每个查询发出网络请求到 mongo。