我不知道nunjucks,但无论使用何种视图引擎,您都可以实现async 功能。为了展示这个想法,我试图重现你的情况。我创建了一个名为 index.html 的 HTML 文件,带有一个 img 标记,没有任何 src 属性:
<html>
<head>
<meta charset="utf-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
<title>Reproduce</title>
</head>
<body>
<img id='bg'></img>
<script src='./so.js'></script>
</body>
</html>
我的 HTML 中有一个 <script> 标记,它链接到我的 so.js 文件,如下所示,通过向 NodeJS/Express 服务器发送 HTTP 请求来请求图像:
getImage();
function getImage(){
// Get an image by its name as URL parameter
fetch('/bg/background.jpg',{
method: 'GET',
headers: {
'Content-Type': 'application/json'
}
}).then(result=>{
return result.blob()
}).then(result=>{
console.log('result -> ', result)
document.querySelector('#bg').src=URL.createObjectURL(result)
document.querySelector('#bg').style.width='200px'
}).catch(err=>{
console.log('err -> ', err)
})
}
这是我在文件名server.js 中的 NodeJS/ExpressJS 代码:
express=require('express')
bodyParser=require('body-parser')
path=require('path')
fetch=require('node-fetch')
server=express()
//Body-parser middleware
server.use(bodyParser.json())
server.use(bodyParser.urlencoded({extended:false}))
server.use(bodyParser.raw())
//Set static path
server.use(express.static(path.join(__dirname,'public')))
server.get('/',(req,res)=>{
res.render('index.html')
})
// Pick a file on hard disk
// and send it as "Blob" to the browser
server.get('/bg/:name',(req,res)=>{
var options = {
root: __dirname + '/public/',
dotfiles: 'deny',
headers: {
'x-timestamp': Date.now(),
'x-sent': true
}
};
var fileName = req.params.name;
res.sendFile(fileName, options, function (err) {
if (err) {
next(err);
} else {
console.log('Sent:', fileName);
}
});
})
server.listen('8000',()=>{
console.log('Server listening on port 8000...')
})
可以看出,我正在通过实现fetch API 在浏览器和服务器之间进行async 通信,甚至不接触视图引擎。
我只是想提供一个替代想法,以使用fetch API 并与之进行async HTTP 通信,而不管正在使用任何视图渲染引擎。