2017-11-20 8 views
0

すべてにお時間をください。私は古典的なapp.jsjson strangesからの設定を簡略

... 
var view = require('./routes/view'); 
... 
app.use('/mix', view); 
... 

を持っており、これは私のview.js

var express = require('express'); 
var router = express.Router(); 
var moment = require("moment"); 

var DB = require('../modules/mysql') 

/* */ 
router.get('/:mixId', (req, res, next) => { 

    /** set defaults */ 
    let config = require('../cfg/hbs.json'); // config load (see example below) 
    var page = "pages/viewFail", 
    alert = {}; 

    /** select info about mix */ 
    DB.query('SELECT startTS, targetAdr, received FROM mixes m WHERE name=?', [req.params.mixId], (err, results) => { 

    /** if not exist */ 
    if (results.length === 0) { 
     alert = { // danger alert 
     "color": "danger", 
     "text": "this mix does not exist" 
     } 
    } 
    /** exist */ 
    else { 

     var mix = { 
     "adr": results[0].targetAdr, 
     "received": results[0].received, 
     /** calculate endin in minudes */ 
     "endin": parseInt(120 - moment.duration(moment().diff(moment(results[0].startTS))).asMinutes()), 
     } 

     /** check end time and ballance. if no transactions and time ends - exit */ 
     if (mix.endin <= 0 && mix.received <= 0) { 
     alert = { 
      "color": "danger", 
      "text": "this mix does not exist" 
     } 
     } else { 

     if (mix.received == 0) { 
      page = 'pages/viewStart' 
     } else { 
      config.meta.js.push("/js/viewEnd.js"); /** add common page js {} */ 
      page = 'pages/viewEnd' 

      console.log(config.meta) 
      console.log("\n------------\n") 

     } 
     } 
    } 


    /** send response */ 
    res.render(page, { 
     layout: 'layout', 
     meta: config.meta, 
     alert: alert, 
     mix: mix, 
    }); 
    }); 
}); 

module.exports = router; 
で最近ノードサーバのコーディングでJavaScriptと実験を学び始め、今では本当に何が起こっているのか理解できない...

ここで

私の設定ファイルである:

{ 
    "meta": { 
    "title": "test partials", 
    "css": [ 
     "https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.2/css/bootstrap.min.css", 
     "/css/c.css" 
    ], 
    "js": [ 
     "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js", 
     "https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.3/umd/popper.min.js", 
     "https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.2/js/bootstrap.min.js" 
    ], 
    "tmp": [ 
     "https://code.jquery.com/jquery-3.2.1.slim.min.js" 
    ] 

    } 
} 

そして、問題がある:私はページmeta.jsを再起動したときに追加時間が経つと結果は次のようになります。

{ title: 'test partials', 
    css: 
    [ 'https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.2/css/bootstrap.min.css', 
    '/css/c.css' ], 
    js: 
    [ 'https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js', 
    'https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.3/umd/popper.min.js', 
    'https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.2/js/bootstrap.min.js', 
    '/js/viewEnd.js', // ?????? 
    '/js/viewEnd.js', // ?????? 
    '/js/viewEnd.js' ],// ?????? 
    tmp: [ 'https://code.jquery.com/jquery-3.2.1.slim.min.js' ] } 

私は間違っていますか?

+0

はイムはハンドルバーを使用して、私のテンプレートコードであることを言ったために忘れてしまった:一つの簡単な解決策は、それをコードするJSONてオブジェクトのディープコピーを取ることですsrc = "{{。}}"> {{/ each}}しかし、これが重要だとは思わないでください。 – goof

答えて

1

は、次の点を考慮

let config1 = require('../cfg/hbs.json'); 
let config2 = require('../cfg/hbs.json'); 

console.log(config1 === config2); 

これはconfig1config2がまったく同じオブジェクトを参照することを意味し、値trueがログに記録されます。

この理由は、requireがキャッシュを実行するためです。これは初めてファイルを読むだけです。その後、同じファイルをrequireに呼び出すと、キャッシュされたオブジェクトが返されます。

これはあなたのコードで起こっていることです。ルートが呼び出されるたびに、同じconfigオブジェクトが引き込まれ、余分なエントリが同じ配列にプッシュされます。

これを解決するにはいくつかの方法があります。 {{#eachのmeta.js}} \t <スクリプトを:

let config = JSON.parse(JSON.stringify(require('../cfg/hbs.json'))); 
+0

Thanskたくさんあります。別の解決策が見つかりました:https://stackoverflow.com/questions/9210542/node-js-require-cache-possible-to-invalidate、あなたはよりきれいです。 – goof