NodeJ是按顺序加载的模块吗?

时间:2015-11-08 14:06:41

标签: node.js

我使用模块tough-cookie-filestore将cookie保存到本地文件。设置request以使用此cookie jar时,它要求该文件已存在于磁盘上。当我在多个模块中使用这个cookie jar时,我想避免在我的模块顶部检查一大块代码,它检查cookie文件是否存在,如果不存在,那么我创建了一个模块initcookie.js这样做。

我的问题是,这是一种安全而好的方法吗? initcookie.init()确保文件存在,但我可以确定它是在执行new FileCookieStore(config.cookiePath)之前运行的吗?

var initcookie = require('../initcookie.js').init()
var config = require('../config.js')
var FileCookieStore = require('tough-cookie-filestore')
var request = require('request')
var j = request.jar(new FileCookieStore(config.cookiePath))
request = request.defaults({ jar: j })

initcookie.js的位置:

var config = require('./config.js')
var fs = require('fs')

// Initialize cookie file which stores the login info
exports.init = function () {
  try {
    fs.openSync(config.cookiePath, 'r')
  } catch (e) {
    if (e.code === 'ENOENT') {
      // File not found, so make one
      fs.writeFileSync(config.cookiePath, '', { flags: 'wx' }, function (err) {
        if (err) { throw (err) }
      })
    } else {
      throw (e)
    }
  }
}

1 个答案:

答案 0 :(得分:1)

这种方式可行,但不是最好的方法。 fs.writeFileSyncfs.openSync将确保您的代码同步执行,但最好使用异步,这样您就不会阻止该线程。你可以写

var config = require('./config.js')
var fs = require('fs')

// Initialize cookie file which stores the login info
exports.init = function () {
  return new Promise(function (resolve, reject) {
    try {
      fs.openSync(config.cookiePath, 'r')
      resolve()
    } catch (e) {
      if (e.code === 'ENOENT') {
        // File not found, so make one
        fs.writeFile(config.cookiePath, '', { flags: 'wx' }, function (err) {
          if (err) { reject(err) }
          else { resolve() }
        })
      } else {
        reject(e)
      }
    }
  }
}

这样您就可以在其他文件中使用Promises,并确保在不占用线程的情况下创建cookie。

我可以看到你遇到的唯一问题是,如果异步导致你在完成之前多次运行此函数,那么创建一个竞争条件。为了避免这种情况,我只在程序开始时调用此函数一次,并将其他所有内容放在该承诺的成功函数中。