DigitalOcean无服务器函数中NodeJS输出HTML失败求助
解决DigitalOcean无服务器函数输出HTML的问题
你的核心问题是没搞懂DigitalOcean无服务器函数的响应机制——它不是传统Node.js HTTP服务器,不需要用res.setHeader或res.end,而是通过返回一个包含headers和body的对象来输出内容,这也是官方示例的核心逻辑。
错误原因
你代码里的res完全没定义,因为DO函数不会传入原生HTTP的res对象,直接调用肯定报错。另外你用了立即执行的async函数,但没正确处理返回值,导致函数默认返回undefined,自然无法输出任何内容到响应里。
修改后的可用代码
const metascraper = require('metascraper')([ require('metascraper-title')() ]) const got = require('got'); exports.main = async (args) => { const targetUrl = "https://facebook.com"; try { const { body: html, url } = await got(targetUrl); const metadata = await metascraper({ html, url }); // 输出HTML内容(可自定义结构) return { headers: { 'content-type': 'text/html; charset=UTF-8' }, body: `<h1>Print test</h1><p>抓取到的页面标题:${metadata.title}</p>` }; // 如果需要输出JSON,替换成下面的返回逻辑 // return { // headers: { 'content-type': 'application/json; charset=utf-8' }, // body: JSON.stringify(metadata) // }; } catch (err) { // 统一处理错误,返回错误提示页面 return { headers: { 'content-type': 'text/html; charset=UTF-8' }, statusCode: 500, body: `<h1>请求出错</h1><p>${err.message}</p>` }; } }
关键注意点
- 将
main声明为async函数:因为代码里用了await处理异步请求,必须让函数本身是异步的,才能正确返回异步操作后的结果。 - 返回标准响应对象:这个对象必须包含
headers(指定内容类型,比如HTML或JSON)和body(要输出的内容字符串),DO平台会自动把这个对象转换成HTTP响应返回给请求方。 - 完善错误捕获:用try/catch包裹所有异步逻辑,避免出现未处理的Promise拒绝,同时给用户返回明确的错误提示。
你之前尝试官方的.then写法无效,大概率是因为没有正确返回那个包含headers和body的响应对象,或者异步逻辑的嵌套位置不对。用async/await的写法更直观,也更容易调试。
内容的提问来源于stack exchange,提问作者ewfewfjio
相关产品推荐
相关产品推荐

