是否可以在函数内导出模块?

时间:2019-08-11 09:45:11

标签: javascript node.js multer

因此,我刚刚在YouTube上观看了一些教程,这些教程是关于使用Multer上传文件的。

将变量gfs连接到我的/routes文件夹时,我需要导出该变量,但是我该怎么做?

const mongoose = require("mongoose")
const Grid = require("gridfs-stream")

// Routes
const user = require("./routes/api/users")

// Init gfs
let gfs

// create gfs on connection 'open'
mongoose.connection
  .once("open", () => {
    // Init stream
    gfs = Grid(mongoose.connection.db, mongoose.mongo)
    gfs.collection("uploads")
    console.log("mongoDB connected and gfs has been created")
  })
  .on("error", err => {
    console.log("connection error", err)
  })

// I need the gfs on the user routes
// use routes
app.use("/api/users", user)

2 个答案:

答案 0 :(得分:1)

如果您想访问gfs和/或middleware内部的controller,则可以执行以下操作:

mongoose.connection
  .once('open', () => {
    const gfs = Grid(mongoose.connection.db, mongoose.mongo)
    gfs.collection('uploads')

    // use `app.locals` to store the result when it finishes
    app.locals.gfs = gfs
  })

根据Express文档:

  

app.locals对象的属性是应用程序中的局部变量。

     

设置后,app.locals属性的值将在应用程序的整个生命周期中保持不变,而res.locals属性仅在请求的生命周期内有效。


请务必记住,在middleware和/或controller内部,正在处理route的地方,您需要检查gfs在您对其进行处理之前存在。

上述调用是异步的,因此gfs不会立即可供您使用:

app.use('api/users/', user)

// routes/api/users.js
route.get('/', function(req, res, next) {
  if (req.app.locals.gfs) {
    // check if `app.locals.gfs` exists
  }
  // handle a case where `app.locals.gfs` hasn't been set yet
})

如果您想了解有关app.locals的更多信息,请访问以下链接:

答案 1 :(得分:0)

let conn = mongoose.createConnection(<url>);
let gfs = Grid(conn.db, conn.mongo);
gfs.collection("uploads");
// write routes
module.exports = gfs;