2015-01-15 9 views
5

Quindi eseguo una piccola applicazione di test per restituire il contenuto di un file markdown in html quando viene visitata una rotta. Sto usando segnato per rendere il markdown (https://github.com/chjj/marked).restituendo markdown reso con express e contrassegnato

us Qui quello che ho finora -

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

Se navigando a localhost: 3000 sto ottenendo -

TypeError: Impossibile chiamare il metodo 'sostituire' di indefinito prega di segnalare questo a https://github.com/chij/marked.

Sono quasi certo che sto cercando di inviare una stringa, e res.send ('Hello World!') Funziona bene. Scusa se sono nuovo sia per Node che per Express, quindi sto ancora cercando di capire le cose. Ogni aiuto è molto apprezzato.

risposta

8

Se si desidera assegnare i dati del file a una variabile, è necessario provare il metodo fs.readFileSync().

sincrono Soluzione

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

Asynchronous Soluzione

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 Soluzione

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

Poiché la programmazione asincrona passerà al passaggio successivo, eseguendo il precedente in un thread separato, l'accesso ai dati assegnati in modo asincrono all'esterno della funzione di callback potrebbe comportare una condizione di competizione. Se si desidera utilizzarlo in modo asincrono, è possibile gestire la risposta all'interno della funzione di callback asincrona o convertirla in una promessa.

Informazioni sul promesse:

Asynchronous Programming in JavaScript with Promises

Promise.js

Bluebird (Un'altra promessa lib)

+0

Grazie per l'aiuto! – salxander

+0

@Xander Felice di aiutare :) Ho appena aggiunto un esempio con promesse. –