1

初めてノードとテンプレート エンジンを操作します (はい、「開始」するのはひどい場所ですが、何でも)。私はjsonストリームからいくつかのコンテンツを構築しています。最後に、この(更新された)expressjsスニペットで次のように、このコンテンツをhtmlページのdivに吐き出したいと思います:

app.get('/foo', function (req, res) {

  //... get my stream called 'mystream'

  //... get ready to append content for items found in json stream
  var htmlbuf = "";

  //now process the json stream:
  oboe(mystream)
  .node('{bar}', function(aBar){
    //eventually, I'd like to actually append individual new DOM elements,
    //but for now I'll settle for just spitting out raw html:
    var buffer = '<p>Found a bar with name'+ aBar.name + '</p>';
    res.render('index', {itemsfound: htmlbuf});
    });
});

index.pug:

doctype html
html
    head
        link(type='text/css', rel='stylesheet', href='./css/main.css')
        title Hello
    body
        h1 Hello world!
        div#results.listing
            items= itemsfound

エラー: 送信後にヘッダーを設定できません」というエラーが表示されます。問題は、oboe.node() がいつでも起動していて、適切なタイミングで応答コンテンツを送信していないことだと思いますか? oboe.node() イベントを配線して、pug テンプレートで dom 要素をターゲットまたは作成し、応答を正しく送信できるようにするために必要なコード/フレームワークは何ですか? ありがとう。

4

2 に答える 2

1

次のようにする必要があります。

app.get('/foo', function (req, res, next) {

  //... get my stream called 'mystream'

  //... get ready to append content for items found in json stream
  var htmlbuf = "";

  //now process the json stream:
  oboe(mystream)
  .node('{bar}', function(aBar){
    //eventually, I'd like to actually append individual new DOM elements,
    //but for now I'll settle for just spitting out raw html:
    htmlbuf += '<p>Found a bar with name' + aBar.name + '</p>';
  })
  .on('fail', function (err) {
    res.statusCode = err.statusCode
    next(err.thrown)
  })
  .on('done', function () {
    res.render('index', {itemsfound: htmlbuf});
  });
});
于 2016-08-26T14:37:33.017 に答える
0

わかりました、試してみます。

計算されたコンテンツを含むページをレンダリングする場合は、

// js
app.get('/foo', function (req, res) {
    res.locals.var1 = 'Res.locals.var1'; // you can define vars here too

    if (!req.xhr)
        // send as html-page
        res.render('page.jade', {bar: smth-content, title: 'Hello world'}); // without var1
    else
        // send as json on ajax-request
        res.json({bar: smth-content, title: 'Hello world'}); 
});

// .jade
doctype html
html
  head
    link(type='text/css', rel='stylesheet', href='./css/main.css')
    |     
    title #{title} 
  body
    h1 Hello world!
    |   
    #{bar} #{var1}

テンプレート コードを混在させるには、キーワードextendsincludejade キーワードを使用できます。またはこのトリック(非推奨)

// js
app.get('/foo', function (req, res) {
    res.render('row.jade', {myblock: smth-content}, function(err, html) {
        if (err)
            return res.send(err.message);
        res.render('page.jade', {myblock: html});
    }); 
});

// page.jade
doctype html
html
  head
    link(type='text/css', rel='stylesheet', href='./css/main.css')
  body
    #{myblock} 

// myblock.jade
p Found a bar with name #{myblock}
于 2016-08-25T23:29:04.737 に答える