我使用模块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)
}
}
}
答案 0 :(得分:1)
这种方式可行,但不是最好的方法。 fs.writeFileSync
和fs.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。
我可以看到你遇到的唯一问题是,如果异步导致你在完成之前多次运行此函数,那么创建一个竞争条件。为了避免这种情况,我只在程序开始时调用此函数一次,并将其他所有内容放在该承诺的成功函数中。