fs.writeFileSync 不能在这里设置 DOCTYPE

Posted

技术标签:

【中文标题】fs.writeFileSync 不能在这里设置 DOCTYPE【英文标题】:fs.writeFileSync Can't set DOCTYPE here 【发布时间】:2021-12-30 18:15:04 【问题描述】:

此 Meteor 代码使用 fs.writeFileSync 将文件保存到带有 html 扩展名的光盘,它保存文件正常,但我收到以下服务器错误

使用模板编译器(针对目标 web.browser)处理文件时: screen_shots/page.html:1: 不能在这里设置 DOCTYPE。 (流星集为 你)

以及以下浏览器控制台消息

Uncaught SyntaxError: Unexpected token

知道如何解决这个错误吗?谢谢

import  Meteor  from 'meteor/meteor';
const puppeteer = require('puppeteer'); //maybe change const to let
const fs = require('fs')
//.... SOME CODE HERE...
let searchLink = await page.$('input[]')
await searchLink.click()

await page.waitForNavigation()
const html = await page.content()
fs.writeFileSync("/screen_shots/page.html", html, 'utf8') //removing utf8 did not eleminate the error

【问题讨论】:

第一个错误听起来像是您可能有一些服务器端进程来监视新文件并尝试使用模板编译器编译它们,并且它试图在您刚刚创建的新 /screen_shots/page.html 文件上执行此操作写了,但它不是一个有效的模板,所以它会出错。第二个听起来像是有人试图解析一些 JSON,但它不是合法的 JSON。 另外,您查看过/screen_shots/page.html 中的内容吗?它看起来像有效的 HTML 吗? @jfriend00 是的,它似乎是来自信誉良好的机构的有效 HTML,并且可以在浏览器中正确打开。我注意到如果文件存在,只要应用程序启动就会发生错误,但如果文件不存在,错误就会消失。 再一次,听起来你有一些模板重新编译过程在服务器启动时运行,它发现这个不是模板的文件。 您似乎正在写入一个绝对位置“/screen_shots/page.html”,我假设这是有意的。如果该文件夹在您的 Meteor 项目源文件夹中,Meteor 将检测到更改并进行重建,并且您检索到的 HTML 文件不是正确的模板,这可能是导致您的错误的原因。您可以尝试写入源代码树之外的位置以确认该理论。 【参考方案1】:

/screen_shots/page.html 的位置在您的源代码树中,这会导致 Meteor 开始重建,并中止它正在执行的操作。你绝对不想要这个。 Meteor 监视所有显式导入的源文件,以及 clientserver 文件夹中的任何内容。

在此模式下运行流星或流星运行时,除 /imports 文件夹中的文件之外的所有文件都会自动加载。还有一些其他的规则,都可以在这个页面上找到:https://guide.meteor.com/structure.html#load-order

这里有更多信息:https://***.com/a/64116026/517914

您在同一文件夹中写入的.png 文件也会自动加载,但不会导致错误。

你可能不会写入文件系统

既然您了解了发生了什么,您可能希望避免写入文件系统。这有几个原因

    使用docker时,本地文件系统默认为只读 您可以附加卷,但需要将其附加到伸缩组中的每台服务器 卷已满 S3(或类似)更方便,您可以对文件应用策略和权限

【讨论】:

以上是关于fs.writeFileSync 不能在这里设置 DOCTYPE的主要内容,如果未能解决你的问题,请参考以下文章

等待承诺的 fs.writeFile 与 fs.writeFileSync

节点 fs.writeFileSync() 永远不会返回

fs.writeFileSync 给出错误:未知,在 nodejs 中进行同步文件写入的正确方法

Nodemon fs.writeFileSync 崩溃

nodejs写文件

[Node.js] Write or Append to a File in Node.js with fs.writeFile and fs.writeFileSync