2015-11-08 3 views
0

Я использую модуль tough-cookie-filestore, который сохраняет файлы cookie в локальном файле. При установке request для использования этого кука-кука-файла требуется, чтобы файл уже был на диске. Поскольку я использую этот кувшин cookie в нескольких модулях, я хочу избежать большого блока кода в верхней части моих модулей, который проверяет, существует ли файл cookie и если он его не создает, и поэтому я сделал модуль initcookie.js, который делает это.Модуль NodeJs загружен в порядке?

Вопрос мой, это безопасный и хороший способ сделать это? 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

Одним из способов подтверждения этого было бы разместить что-то долгое выполнение/блокировку внутри вашей функции init и посмотреть, все еще вызывается новый файл FileCookieStore (config.cookiePath). –

ответ

1

Этот способ будет работать, но это не самый лучший способ сделать это. fs.writeFileSync и fs.openSync убедитесь, что ваш код выполняется синхронно, но лучше было бы использовать async, чтобы вы не поддерживали поток. Вы можете написать

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) 
     } 
    } 
    } 
} 

Таким образом, вы можете использовать посылы в других ваших файлов и быть уверенным, cookiePath создается без держа нить.

Единственная проблема, с которой я мог столкнуться, заключалась бы в том, что если async заставляет вас запускать эту функцию кучу раз, прежде чем она завершится, и поэтому создайте условие гонки. Чтобы этого избежать, я бы назвал эту функцию только в начале программы и поставил все остальное в функции успеха этого обещания.

+0

1) Вам не хватает некоторых утверждений о возврате? Почему «return resolve()» if open = success, но просто 'resolve()', если write = success? Они равны? 2) Вы имеете в виду, что каждый модуль, который использует файл cookie, должен быть «обязательным» в основном модуле в '.then (функция success()'? – tsorn

+0

сожалеет об этом, должно быть просто разрешено(). Да, это то, что я «Я говорю, или любой способ, которым вы выполняете чек в начале программы, будет работать –

Смежные вопросы