Javascript AJAX请求Express.JS中服务器上的数据显示在客户端?

Javascript AJAX请求Express.JS中服务器上的数据显示在客户端?,javascript,node.js,ajax,express,Javascript,Node.js,Ajax,Express,我的任务是在客户端显示此代码。 我设法在页面上加载数据/内容,但事实并非如此 var express=require('express'); 路由器=express.router(), connect=require('connect'), urlParse=require('url')。parse, fs=要求('fs'); var iconList=fs.readFileSync('app/data/icons.list').toString().split('\n').filter(函数

我的任务是在客户端显示此代码。 我设法在页面上加载数据/内容,但事实并非如此

var express=require('express');
路由器=express.router(),
connect=require('connect'),
urlParse=require('url')。parse,
fs=要求('fs');
var iconList=fs.readFileSync('app/data/icons.list').toString().split('\n').filter(函数(站点)){
返回站点;
});
var随机=函数(最大值){
返回Math.floor(Math.random()*max);
};
var icon2Site=函数(图标){
var site=icon.replace(/\.png$/,”).replace(/\.png$/,”);
返回站点;
};
风险价值=[];
//破坏生成
(功能(){
对于(变量i=0;i<1000;i++){
var指数=随机(iconList.length);
推({
地点:icon2Site(iconList[索引]),
日期:date.now()-432000000+随机(432000000),
编号:随机(100000)
});
}
})();
违反。排序(功能(a、b){
返回a.日期-b.日期;
});
var jsonResponse=函数(res、代码、正文){
文件头(代码{
“内容类型”:“应用程序/json”,
“内容长度”:缓冲区。字节长度(正文)
});
决议结束(正文);
};
var foo=connect()
.use(connect.logger('dev'))
.使用(功能(req、res、next){
req.parsedUrl=urlParse(req.url,true);
next();
})
.使用(功能(req、res、next){
如果(req.parsedUrl.pathname!='/ws/breaks'){
返回next();
}
var index=parseInt(req.parsedUrl.query.index,10)| 0;
jsonResponse(res,200,JSON.stringify({
结果:0.slice(索引,索引+20)
}));
})
.使用(功能(req、res、next){
if(req.parsedUrl.pathname!=='/ws/icon'){
返回next();
}
var site=req.parsedUrl.query.site | |“”;
log(req.parsedUrl.query.site);
site=site.replace(/\./g,'.''.'+'.png“;
jsonResponse(res,200,JSON.stringify({
结果:“https://s3-eu-west-1.amazonaws.com/static-icons/“+站点
}));
})
.use(connect.static(uu dirname+/public){
最大值:1000*60*5//5分钟缓存
}));
router.get('/',函数(req,res){
res.render('index',{pageID:'mainData',违规:违规,iconList:iconList,边栏:['/images/vertbar.jpg']});
控制台日志(违规);
console.log(iconList);
});
module.exports=路由器
GET/ws/breaks?index=[一个正整数]-此Web服务返回一个具有“result”属性的对象,该属性最多包含20个
违规站点,从提供的索引开始(例如呼叫
/ws/Breaks?index=0将返回最后20个被破坏的站点,
/ws/breaks?index=20(下一个20,等等)-被破坏的站点对象
包含以下信息:-站点:被破坏服务器的域
site-date:违约时间,以毫秒为单位-数字:违约时间
泄露的帐户数

如果你看一下描述,有一些关键部分(我已经为你加粗了)。它提供了请求方法(GET)、路径(/ws/GET)+查询字符串(?index=[正整数])和返回值(对象)

使用Express时,必须指定请求方法(您有)、路径(不正确)和响应(不正确)。响应可以采用不同的格式,如纯文本、HTML、XML和JSON。后者通常用于发回对象。Express有方便的方法,例如
res.render()
res.send()
res.json()
和其他方法,以正确的格式发送回响应。在您的例子中,您将使用后一种
res.json()

在描述中,它指定了对象必须包含的内容:它必须具有一个结果属性,该属性是一个站点(对象)数组,每个站点(对象)都包含自己的属性集

在描述中,它还讨论了来自查询字符串的
索引。要访问该值,可以使用
req.query.index
。因此,在构建对象时,需要使用该值执行某些操作

router.get('/ws/breaches', function(req, res) {
    // this is just an example of how the object would look;
    // you are most likely going to be building this object dynamically involving req.query.index
    let obj = {
        result: [
            {
                site: 'http://www.somedomain.com',
                date: 243,
                number: 2
            },
            { 
                site: 'http://www.anotherdomain.com',
                date: 312,
                number: 10
            },
            // etc
        ]
    };
    // send the response
    res.json(obj);
});
当涉及到客户端代码时

var url = "/ws/breaches?index=0"; // example
xmlhttp.onreadystatechange = function() {
    if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
        var result = JSON.parse(xmlhttp.responseText).result;   
        // this should be an array of the sites
        console.log(result);
    }
};
我认为你开始的很好。正如你所说,没有正确的答案,因为许多人对环境的设置不同。不过,您可能应该创建一个用于进行AJAX调用的通用函数,这样就不会到处重复代码