Node.js res.使用express渲染余烬路线

Node.js res.使用express渲染余烬路线,node.js,express,ember.js,routing,Node.js,Express,Ember.js,Routing,我目前有一个使用Express、Node、Ember和Mongo的webapp。Ember应用程序驻留在节点/express安装根目录下的项目文件夹(./public/index.html)中。我已经设置了express来提供来自公共目录的静态文件,并将index.html呈现给任何get请求,以便可以访问ember应用程序 我在我的Ember应用程序中有一个route/view,它有一个接受文件上传的表单,该表单的操作是一个对express route的post请求,该express rout

我目前有一个使用Express、Node、Ember和Mongo的webapp。Ember应用程序驻留在节点/express安装根目录下的项目文件夹(./public/index.html)中。我已经设置了express来提供来自公共目录的静态文件,并将index.html呈现给任何get请求,以便可以访问ember应用程序

我在我的Ember应用程序中有一个route/view,它有一个接受文件上传的表单,该表单的操作是一个对express route的post请求,该express route执行计算并查询本地mysql数据库并进行更新。该函数工作正常,但在.post express函数的末尾,当I res.json或res.send时,响应将显示在浏览器窗口中,并清除我的余烬视图

我假设正确的处理方法是res.render('view',{data:'Finished processing file'})

然后在余烬模板上显示数据值。问题是如何使用express渲染余烬视图。我在项目中添加了express Handlebar并正确设置了视图引擎,但我不知道如何将ember视图与express关联,以便它知道如何使用响应数据渲染正确的视图

用于余烬视图的hbs文件

<div class="col-md-8 col-md-offset-2 text-center">
  <h2 class="toolTitle">Reactivate SKUs</h2>
  <p class="lead">CSV Should Contain 1 Column (SKU) Only</p>
  <form action="/tools/sku/reactivate" method="POST" enctype="multipart/form-data">
    <input class="center-block" type="file" name="csvdata">
    <button type="submit" class="btn btn-md btn-danger">Submit</button>
  </form>
</div>
sku.js express函数

var mysql = require('mysql');
var csv = require('csv-parse');
var multer = require('multer');
var fs = require('fs');

//mysql setup
const connection = mysql.createConnection(
    {
        host     : 'localhost',
        user     : 'rugs_remote2',
        password : 'ofbiz',
        database : 'rugs_prd2',
        multipleStatements: true
    }
);
connection.connect();


module.exports.reactivate = function(req,res){
    //define mysql query function for once readStream emits end event
    function reactivationQuery(arr){
    console.log(arr);

       const queryString = "UPDATE PRODUCT SET SALES_DISCONTINUATION_DATE = NULL WHERE PRODUCT_ID IN (?)";
       connection.query(queryString,arr,function(err,rows,fields){
            console.log(rows,fields);
            if(err){
                console.log('Error running sku.reactivate module error is: '+err);
            }
            res.send('DONE');
        });
    }

    //define array for holding csv data in this case skus
    const skuArray = [];
    //define filesystem readstream from uploaded file
    let readStream = fs.createReadStream(req.file.path).pipe(csv());
    //push csv data to array ignoring headers to skuArray
    readStream.on('data', function(chunk){
        if(chunk[0] !== 'SKU'){
            skuArray.push(chunk[0]);
        }
    });
    //error handling
    readStream.on('error',function(err){
        console.log('Error while reading file stream [ERROR] '+ err);
        res.send('Error while processing file');
    });
    //once read is finished map skuArray to usable string for IN Clause
    readStream.on('end',function(){
       let stringifyArray = skuArray;
       stringifyArray = [stringifyArray]; 
       reactivationQuery(stringifyArray);
    });

} 

多亏了作者在评论中的帮助,我才明白这一点

我在表单提交上做了一个完整的post请求,而不是使用ajax进行请求。这就是为什么我被发送出我的ember应用程序,express只在浏览器中呈现对上传的响应

我再次安装了ember uploader,它最初给了我一些问题,因为我没有设置paramName选项来匹配我的文件输入名。下面更新了代码,以防其他人遇到类似问题

余烬HBS模板:

<div class="col-md-8 col-md-offset-2 text-center">
  <h2 class="toolTitle">Reactivate SKUs</h2>
  <p class="lead">CSV Should Contain 1 Column (SKU) Only</p>
  <p class="lead flash-msg"></p>
  {{file-upload id="upload" url="/tools/sku/reactivate" class="center-block" name="csvdata"}}
</div>
快速路由器

var quotes = require('../api/quote');
var cors = require('cors');
var sku = require('../api/tools/sku');
var multer = require('multer');
var upload = multer({ dest: 'uploads/' });
var util = require("util");
var fs = require("fs"); 

var corsOptions = {
    origin: 'http://localhost:4200'
}

module.exports = function(router){
    router.route('/quotes').post(cors(corsOptions),function(req,res){
        console.log(req.body);
        quotes.addQuote(req,res);
    }).get(cors(corsOptions),function(req,res){
        quotes.getAllQuotes(req,res);
    });
    router.route('*').get(cors(corsOptions), function(req,res){
        res.sendFile('public/index.html',{root:'./'});
    });
    router.route('/tools/sku/reactivate').post(upload.single('csvdata'),function(req,res){
        console.log('handing request over to sku.reactivate');
        sku.reactivate(req,res);
    });
};
var quotes = require('../api/quote');
var cors = require('cors');
var sku = require('../api/tools/sku');
var multer = require('multer');
var upload = multer({ dest: 'uploads/' });
var util = require("util");
var fs = require("fs"); 

var corsOptions = {
    origin: 'http://localhost:4200'
}

module.exports = function(router){
    router.route('/quotes').post(cors(corsOptions),function(req,res){
        console.log(req.body);
        quotes.addQuote(req,res);
    }).get(cors(corsOptions),function(req,res){
        quotes.getAllQuotes(req,res);
    });
    router.route('*').get(cors(corsOptions), function(req,res){
        res.sendFile('public/index.html',{root:'./'});
    });
    router.route('/tools/sku/reactivate').post(upload.single('csvdata'),function(req,res){
        console.log('handing request over to sku.reactivate');
        sku.reactivate(req,res);
    });
};
express api功能模块:

var mysql = require('mysql');
var csv = require('csv-parse');
var multer = require('multer');
var fs = require('fs');

//mysql setup
const connection = mysql.createConnection(
    {
        host     : 'localhost',
        user     : 'rugs_remote2',
        password : 'ofbiz',
        database : 'rugs_prd2',
        multipleStatements: true
    }
);

connection.connect();

module.exports.reactivate = function(req,res){
    //define mysql query function for once readStream emits end event
    function reactivationQuery(arr){
        const queryString = "UPDATE PRODUCT SET SALES_DISCONTINUATION_DATE = NULL WHERE PRODUCT_ID IN (?)";
        connection.query(queryString,arr,function(err,rows,fields){
            if(err){
                console.log('Error running sku.reactivate module error is: '+err);
                res.json(err);
            }
            res.json('Successfully reactivated '+rows.changedRows+' SKUs');
        });
    }

    //define array for holding csv data in this case skus
    const skuArray = [];
    //define filesystem readstream from uploaded file
    let readStream = fs.createReadStream(req.file.path).pipe(csv());
    //push csv data to array ignoring headers to skuArray
    readStream.on('data', function(chunk){
        if(chunk[0] !== 'SKU'){
            skuArray.push(chunk[0]);
        }
    });
    //error handling
    readStream.on('error',function(err){
        console.log('Error while reading file stream [ERROR] '+ err);
        res.json('Error while processing file');
    });
    //once read is finished map skuArray to usable string for IN Clause
    readStream.on('end',function(){
       let stringifyArray = skuArray;
       stringifyArray = [stringifyArray]; 
       reactivationQuery(stringifyArray);
    });

} 

我认为这更多的是关于如何运行ember应用程序和express应用程序的问题——您将希望将express应用程序视为一个自己运行的api,而ember应用程序具有
ember s--proxy=localhost:3000
(或任何端口)。这使得ember应用程序的请求能够通过express in Development这是我将ember代理到节点服务器的一件奇怪的事情。但我仍然在浏览器中得到响应,而不是仅仅将数据返回到发出post请求的ember模板。啊,你正在做一个常规表单post,它将你带出ember并返回到/tools/sky/reactive返回的任何内容。你应该在表单中使用一个ember操作来控制发生了什么(一个ajax/xhr帖子,而不是一个完整的http帖子)。是的,这就是我最初认为的问题所在,我在使用ajax发送formData和csv时遇到了一些问题,但我会解决的。谢谢你的指导。
var mysql = require('mysql');
var csv = require('csv-parse');
var multer = require('multer');
var fs = require('fs');

//mysql setup
const connection = mysql.createConnection(
    {
        host     : 'localhost',
        user     : 'rugs_remote2',
        password : 'ofbiz',
        database : 'rugs_prd2',
        multipleStatements: true
    }
);

connection.connect();

module.exports.reactivate = function(req,res){
    //define mysql query function for once readStream emits end event
    function reactivationQuery(arr){
        const queryString = "UPDATE PRODUCT SET SALES_DISCONTINUATION_DATE = NULL WHERE PRODUCT_ID IN (?)";
        connection.query(queryString,arr,function(err,rows,fields){
            if(err){
                console.log('Error running sku.reactivate module error is: '+err);
                res.json(err);
            }
            res.json('Successfully reactivated '+rows.changedRows+' SKUs');
        });
    }

    //define array for holding csv data in this case skus
    const skuArray = [];
    //define filesystem readstream from uploaded file
    let readStream = fs.createReadStream(req.file.path).pipe(csv());
    //push csv data to array ignoring headers to skuArray
    readStream.on('data', function(chunk){
        if(chunk[0] !== 'SKU'){
            skuArray.push(chunk[0]);
        }
    });
    //error handling
    readStream.on('error',function(err){
        console.log('Error while reading file stream [ERROR] '+ err);
        res.json('Error while processing file');
    });
    //once read is finished map skuArray to usable string for IN Clause
    readStream.on('end',function(){
       let stringifyArray = skuArray;
       stringifyArray = [stringifyArray]; 
       reactivationQuery(stringifyArray);
    });

}