app.js
import express from "express";
import helmet from "helmet";
import morgan from "morgan";
import cors from "cors";
import tweetRouter from "./tweet.router.js";
const app = express();
app.use(express.json());
app.use(morgan("dev"));
app.use(helmet());
app.use(cors());
app.use("/tweet", tweetRouter);
app.use((req, res, next) => {
res.sendStatus(404);
});
app.use((err, req, res, next) => {
res.sendStatus(500);
});
app.listen(8000);
app.router.js
import express from "express";
const tweetRouter = express.Router();
let tweets = [
{
id: "1",
createdAt: "2022-12-01",
name: "SeokHyun Yu",
username: "ysh",
text: "Hello",
},
];
tweetRouter.get("/", (req, res) => {
const tempTweets = req.query.username
? tweets.filter((tweet) => tweet.username === req.query.username)
: tweets;
res.status(200).json(tempTweets);
});
tweetRouter.get("/:id", (req, res) => {
const { id } = req.params;
const tweet = tweets.find((tweet) => tweet.id === id);
if (tweet) {
res.status(200).json(tweet);
} else {
res.status(404).json({ status: 404, message: `id ${id} NOT FOUND` });
}
});
tweetRouter.post("/", (req, res) => {
tweets = [req.body, ...tweets];
res.status(201).json(tweets);
});
tweetRouter.put("/:id", (req, res) => {
const { id } = req.params;
const { text } = req.body;
const tweet = tweets.find((tweet) => tweet.id === id);
if (tweet) {
tweet.text = text;
res.status(200).json(tweet);
} else {
res.status(404).json({ status: 404, message: `id ${id} NOT FOUND` });
}
});
tweetRouter.delete("/:id", (req, res) => {
const { id } = req.params;
const prevLength = tweets.length;
tweets = tweets.filter((tweet) => tweet.id !== id);
if (prevLength !== tweets.length) {
res.sendStatus(204);
} else {
res.status(404).json({ status: 404, message: `id ${id} NOT FOUND` });
}
});
export default tweetRouter;
![](https://velog.velcdn.com/images/fkstndnjs/post/ce9cbbb5-ebef-431a-9cf1-daa154971ca2/image.png)
![](https://velog.velcdn.com/images/fkstndnjs/post/94c92df5-8878-4914-a813-e288c315305e/image.png)
![](https://velog.velcdn.com/images/fkstndnjs/post/e0b2d24d-be76-4a5b-94e6-0d24919243bd/image.png)
![](https://velog.velcdn.com/images/fkstndnjs/post/77745e23-b4c4-4eea-940e-b72c3176ddc7/image.png)
![](https://velog.velcdn.com/images/fkstndnjs/post/2906948a-3290-46be-8b73-87433950a66c/image.png)
![](https://velog.velcdn.com/images/fkstndnjs/post/9431cb21-dc97-4029-8ccc-a793da0f9bb3/image.png)
![](https://velog.velcdn.com/images/fkstndnjs/post/6ecf274d-ff6c-4605-b89c-6d30d3413b71/image.png)
![](https://velog.velcdn.com/images/fkstndnjs/post/4102d5f8-7b13-4efe-b521-c3e2e2890c8a/image.png)
![](https://velog.velcdn.com/images/fkstndnjs/post/f42aae5f-9835-42d3-b2b0-217faaf1c2b5/image.png)
![](https://velog.velcdn.com/images/fkstndnjs/post/de4dbb91-843e-451e-b4a0-b0223e91e116/image.png)
![](https://velog.velcdn.com/images/fkstndnjs/post/0b765b8b-662e-4dca-b91f-c1014be7fc3f/image.png)
![](https://velog.velcdn.com/images/fkstndnjs/post/ac9575f4-2041-4bdb-b159-f42d7e1fb069/image.png)
![](https://velog.velcdn.com/images/fkstndnjs/post/582e0443-e731-445f-bbaa-0db3f22e81db/image.png)
![](https://velog.velcdn.com/images/fkstndnjs/post/6f28411d-b726-4352-9da3-5058344c7177/image.png)
![](https://velog.velcdn.com/images/fkstndnjs/post/a080ca08-6917-4725-ad29-8536522528e9/image.png)
![](https://velog.velcdn.com/images/fkstndnjs/post/0551dde0-475f-4985-bf14-c75b9e806146/image.png)
![](https://velog.velcdn.com/images/fkstndnjs/post/20346cd6-e97c-4ea3-923e-fd8e6a79ab36/image.png)
![](https://velog.velcdn.com/images/fkstndnjs/post/a983140c-fe8d-4c5a-ac00-f957e79ea912/image.png)
![](https://velog.velcdn.com/images/fkstndnjs/post/38edcd36-d90a-4ac0-b0ea-c580075b6c2c/image.png)
![](https://velog.velcdn.com/images/fkstndnjs/post/5764dcf9-e1b8-44db-9ac2-23b8f120cefe/image.png)