基于node.js开发的文章生成器(一、准备章)

简介: # 引言今天带来的是狗屁不通文章生成器第一部分,即输入一个文章题目,和相应的字数,便自动生成一篇对应字数的文章。![image.png](https://ucc.alicdn.com/pic/developer-ecology/y3obldvnqeb54_1ef6d9d62323412f9e4edef8737f9f10.png)如上图那么这么好玩的文章生成器是怎么制作的,接下来带大家制作这个文章生成器# 准备首先创建一个文件夹article,然后切换到article目录下,调出cmd,执行如下代码完成项目的初始化`npm init -y`它会在项目目录下生成一个 pac

引言

今天带来的是狗屁不通文章生成器第一部分,即输入一个文章题目,和相应的字数,便自动生成一篇对应字数的文章。

image.png

如上图
那么这么好玩的文章生成器是怎么制作的,接下来带大家制作这个文章生成器

准备

首先创建一个文件夹article,然后切换到article目录下,调出cmd,执行如下代码完成项目的初始化

npm init -y

它会在项目目录下生成一个 pacakge.json 文件,我们用ide打开这个文件夹,可以看到文件夹中有一个package.json的文件,文件中内容如下

image.png

模块管理

众所周知,在模块管理上,Node.js有CommonJS和ES Modules两种标准,这里我采用ES Modules标准来撰写项目。但是默认初始化的node项目采取了CommonJS的模式,所以我们要在package.json进行配置
在package.json中 加入"type"="moudle"

最终package.json配置文件内容如下:

{
  "name": "article",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "type": "module"
}

准备工作告一段落,接下来进入下一阶段

fs模块进行读取文件

文章生成器的核心功能的实现其实是通过读取后台的语料库,读取功能我们可以通过fs模块来实现

fs的导入

fs是node的一个内置的模块,我们不需要通过npm来下载,我们这个项目采取的是ES Modules标准,所以我们通过import导入fs模块

import fs from 'fs'

完成对fs模块的导入

接下来我们尝试运用fs模块进行文件的读写。

fs读取文件

我们首先在项目目录中创建ceshi.txt,并在其中随便放置一些文字。
然后在项目中创建src目录,并在src目录下创建一个index.js的js文件

文件目录如下:

image.png

接下来我们开始编辑index.js文件,在首行导入fs模块(ES Modules)

fs读取文件可以通过fs.readFile()来进行

代码如下

import fs from 'fs';
fs.readFile('../ceshi.txt',(err,dataStr)=>{
    if(err){
        console.log(err);
    }
    else{
        console.log(dataStr);
    }
})

这几行代码很好理解,因为我们采取ES Modules标准,所以我们通过import来导入所需的fs模块

然后调用fs.readFile()函数,第一个函数填写要读取的路径,我这里采用相对路径的方式,通过../找到src的上一级,再找到ceshi.txt文件,完成读取。

第二个参数我写了一个函数,分别有err和dataStr两个参数,如果读取的时候出现了error,那么error非空则会打印出错误信息,否则没有error,error=null,不会触发打印错误,而是打印读取的dataStr。

接下来我们在控制台,从article目录切换到下一级的src目录,在控制台执行cd src,然后通过node index.js执行代码,完成读取。一定要切换,否则会报出找不到文件的error,解决方案和问题下面再说。

image.png

可以看到,读出来的并不是我们期望的“让我们试一下fs模块好不好用。”而是一大堆字节。那么我们如何解决这个问题呢?这里提供了四种解决方案。

方案一

隐式调用转换字符,将原本的console.log(dataStr);改为console.log(dataStr+"");

成功打印出所期望的文件内容

方案二

显式调用toString()方法

在打印之前,调用toString()函数,完成字节到字符串的转换

else{
        dataStr = dataStr.toString();
        console.log(dataStr);
    }

成功打印出期望字符。

方案三

通过String()的强制类型转换,完成字节到字符的转换

else{
        dataStr = String(dataStr);
        console.log(dataStr);
    }

也是可以成功解决

方案四

直接指定读取文件时的编码,来直接读取字符串

import fs from 'fs';
fs.readFile('../ceshi.txt',{encoding:"utf-8"},(err,dataStr)=>{
    if(err){
        console.log(err);
    }
    else{
        console.log(dataStr);
    }
})

此时读出的dataStr就是我们期望的字符串了

fs读取文件的路径问题及解决方案

上面说过,我们要启动src目录下的index.js必须要先切换到src目录下,再使用node index.js来启动index.js文件,而不能直接执行node src/index.js。

那么这是为什么呢?

原来fs的读文件是针对于当前目录,受启动的环境位置影响。我们在article目录下直接启动

node src/index.js

虽然同样能找到 article/src/index.js,但此时../的路径是相对于article的上一级,所以无法找到ceshi.txt,那么有没有什么解决方案,让我能在任意地方启动js并且还能读取到文件呢?

解决方案一

将readFile中的路径参数由相对路径改为绝对路径。(不推荐)

解决方案二

通过import,meta.url获取一下文件

获取到的结果是: file:///D:/VScodefile3/article/src/index.js

接下来在导入中引入 fileURLToPath 函数

import {fileURLToPath} from 'url';

通过impoort.meta.url获取的路径并不能直接使用,我们使用fileURLToPath()函数进行处理

const pathURL = fileURLToPath(fileURL);

打印一下,结果是D:\VScodefile3\article\src\index.js

接下来我们导入path模块处理

import path from path;

const dirname = path.resolve(pathURL,"../");

通过resolve可以拼接路径并自动处理,上述的dirname的结果是D:\VScodefile3\article\src

已经找到了index.js的所在目录,接下来我们可以继续定位到dirname的上一级,从而找到article目录,继而找到article目录下的ceshi.txt

import fs from 'fs';
import {fileURLToPath} from 'url';
import path from 'path';

const fileURL = import.meta.url;
const pathURL = fileURLToPath(fileURL);
const dirname = path.resolve(pathURL,"../");
const filePath = path.resolve(dirname,"../","ceshi.txt");
fs.readFile(filePath,{encoding:"utf-8"},(err,dataStr)=>{
    if(err){
        console.log(err);
    }
    else{
        console.log(dataStr);
    }
})

最终解决版本如上,下面我们在任意目录中启动index.js都可以找到要读取的ceshi.txt。
第一部分完成,下一文章继续更新这个文章生成器。

相关文章
|
3天前
|
Web App开发 存储 JavaScript
深入浅出Node.js后端开发
【10月更文挑战第31天】本文将引导你进入Node.js的奇妙世界,探索其如何革新后端开发。通过浅显易懂的语言和实际代码示例,我们将一起学习Node.js的核心概念、搭建开发环境,以及实现一个简单但完整的Web应用。无论你是编程新手还是希望拓展技术的开发者,这篇文章都将为你打开一扇通往高效后端开发的大门。
|
3天前
|
Web App开发 JavaScript 前端开发
深入浅出Node.js后端开发
【10月更文挑战第30天】本文将通过一个Node.js的简单示例,引导你进入Node.js的世界。我们将从基础概念讲起,然后一步步深入到代码实现,最后总结Node.js在后端开发中的优势和应用场景。无论你是前端开发者还是后端新手,这篇文章都将为你打开一扇了解Node.js的大门。
11 2
|
12天前
|
开发框架 JavaScript 前端开发
HarmonyOS UI开发:掌握ArkUI(包括Java UI和JS UI)进行界面开发
【10月更文挑战第22天】随着科技发展,操作系统呈现多元化趋势。华为推出的HarmonyOS以其全场景、多设备特性备受关注。本文介绍HarmonyOS的UI开发框架ArkUI,探讨Java UI和JS UI两种开发方式。Java UI适合复杂界面开发,性能较高;JS UI适合快速开发简单界面,跨平台性好。掌握ArkUI可高效打造符合用户需求的界面。
54 8
|
10天前
|
JavaScript 前端开发
javascript开发的简单的弹幕插件
这是一个原生javascript开发的简单的弹幕插件,具有美观、易用,占用的资源较低等特点,可以给弹幕设置内容、颜色、头像、链接地址等属性,鼠标悬停等,简单实用,欢迎下载!
29 5
|
16天前
|
SQL JavaScript 关系型数据库
node博客小项目:接口开发、连接mysql数据库
【10月更文挑战第14天】node博客小项目:接口开发、连接mysql数据库
|
7天前
|
JavaScript 前端开发 安全
深入浅出Node.js后端开发
【10月更文挑战第26天】在这篇文章中,我们将一起探索Node.js的奇妙世界。不同于传统的Java或Python,Node.js以其异步非阻塞I/O和事件驱动的特性,在后端开发领域独树一帜。无论你是初学者还是资深开发者,这篇文章都将为你提供新的视角和思考。从基础概念到实际应用,我们一步步深入Node.js的世界,让你了解其不仅仅是JavaScript运行环境那么简单。
|
2月前
|
JavaScript
NodeJs的安装
文章介绍了Node.js的安装步骤和如何创建第一个Node.js应用。包括从官网下载安装包、安装过程、验证安装是否成功,以及使用Node.js监听端口构建简单服务器的示例代码。
NodeJs的安装
|
1月前
|
JavaScript 开发工具 git
已安装nodejs但是安装hexo报错
已安装nodejs但是安装hexo报错
21 2
|
2月前
|
存储 JavaScript 前端开发
Node 版本控制工具 NVM 的安装和使用(Windows)
本文介绍了NVM(Node Version Manager)的Windows版本——NVM for Windows的安装和使用方法,包括如何安装Node.js的特定版本、列出已安装版本、切换使用不同版本的Node.js,以及其他常用命令,以实现在Windows系统上对Node.js版本的便捷管理。
Node 版本控制工具 NVM 的安装和使用(Windows)
|
26天前
|
Web App开发 JavaScript 前端开发
JavaWeb 22.Node.js_简介和安装
JavaWeb 22.Node.js_简介和安装