2015-01-15 60 views
5

因此,我正在運行一個小的測試應用程序返回一個路線訪問時在HTML中的降價文件的內容。我正在使用標記來呈現降價(https://github.com/chjj/marked)。返回呈現降價與快遞和標記

這裏我們什麼我迄今爲止 -

app.get('/test', function(req, res) { 
    var path = __dirname + '/markdown/test.md' 
    var file = fs.readFile(path, 'utf8', function(err, data) { 
    if(err) { 
     console.log(err) 
    } 
    return data.toString() 
    }) 
    res.send(marked(file)) 
}) 

當我瀏覽到本地主機:3000我越來越 -

類型錯誤:無法調用未定義 「取代」請將此情況報告給https://github.com/chij/marked

我很確定我想發送一個字符串,並且它res.send('Hello World!')工作得很好。對不起,我對這兩個節點都很陌生,所以我仍然在搞清楚。任何幫助深表感謝。

回答

8

如果要將文件的數據分配給變量,則應該嘗試使用fs.readFileSync()方法。

同步解

app.get('/test', function(req, res) { 
    var path = __dirname + '/markdown/test.md'; 
    var file = fs.readFileSync(path, 'utf8'); 
    res.send(marked(file.toString())); 
}); 

異步解

app.get('/test', function(req, res) { 
    var path = __dirname + '/markdown/test.md'; 
    fs.readFile(path, 'utf8', function(err, data) { 
    if(err) { 
     console.log(err); 
    } 
    res.send(marked(data.toString())); 
    }); 
}); 

Promisified解

var Promise = require('bluebird'); // Require 'bluebird' in your package.json file, and run npm install. 
var fs = require('fs'); 
var path = require('path'); 
Promise.promisifyAll(fs); 

app.get('/test', function (req, res) { 
    fs.readFileAsync(path.join(__dirname, '/markdown/test.md')).then(function(val) { 
    res.send(marked(val.toString())); 
    }); 
}); 

由於異步編程將移至下一步,在單獨的線程中運行前一個,訪問回調函數外異步分配的數據可能會導致競爭條件。如果你想異步使用它,你可以在異步回調函數中處理響應,或者將其轉換爲承諾。

上承諾信息:

Asynchronous Programming in JavaScript with Promises

Promise.js

Bluebird(另一個承諾LIB)

+0

感謝您的幫助! – salxander

+0

@Xander高興地幫助:)我也只是添加了一個承諾的例子。 –